Скільки слів влади я кричав?


10

У Skyrim персонаж гравця може використовувати потужні магічні крики (Thu'ums) для досягнення своїх цілей. Кожен крик складається з трьох слів, проте гравець може використати перше одне-два слова, щоб досягти такого ж ефекту з меншою потужністю, але при більш короткому відключенні.

Враховуючи невелику фразу ASCII Thu'um без розділових знаків або пробілів , поверніть, скільки слів сили вона містить.

Приклад:

fusrodah   -> 3
dur        -> 1
kaandrem   -> 2
odah       -> 2
vengaarnos -> 3

Вхід завжди буде рядком рядка ASCII, утвореним одним із криків нижче, вибираючи з цього крику перші 1, 2 або 3 слова та поєднуючи слова в порядку.

dur neh viir
faas ru maar
feim zii gron
fo krah diin
fus ro dah
gaan lah haas
gol hah dov
hun kaal zoor
iiz slen nus
joor zah frul
kaan drem ov
krii lun aus
laas yah nir
lok vah koor
mid vur shaan
mul qah diiv
od ah viing
raan mir tah
rii vaaz zol
strun bah qo
su grah dun
tiid klo ul
ven gaar nos
wuld nah kest
yol toor shul
zul mey gut
zun haal viik

Отже fus, fusroі fusrodahвсі вони є коректними вводами, але fusroviirце не тому, що він використовує слова зі змішаних криків, і rodahне тому, що це не префікс крику. Вам також не потрібно обробляти порожній рядок.


Виграє найкоротший код у байтах.


1
Я дам печиво першому, хто запустив цей алгоритм, у кожному рядку Пісні про драконів (відомий як "тема
Skyrim

Відповіді:


17

Сітківка, 78 42 15 14 байт

ul
xo
[aeiou]+

Спробуйте в Інтернеті

tiidkloul - єдине слово, яке не має такої кількості послідовностей голосних, як число, яке повинно бути надруковано. Тому нам потрібно відповідати слову, щоб дати йому додаткову послідовність голосних. ouбуде відповідати лише tiidkl ou l, і ми можемо замінити ou на оксо, що створює додаткову послідовність.

Мій початковий підхід був не таким простим, але будувався на основі видалення всіх приголосних, потім видалення кількох голосних послідовностей ( ai|ii|aa|...), а потім, нарешті, підрахунок числа букв. Але завдяки @Martin Büttner за те, що думає про це [aeiou]+.


Повертає 3 для fusroviir, який був явно вказаний як недійсний вхід.
atk

1
@atk Я запитав ОП, чи не буде їх введення невірним. Відповідь була ні.
andlrc

1

Сітківка , 313 байт

ah|aus|bah|d(ah|ii[nv]|ov|rem|u[nr])|[fhl]aas|f(eim|o|rul|us)|g(aa[nr]|ol|rah|ron|ut)|haal|hah|hun|iiz|joor|k(aa[ln]|est|lo|oor|rah|rii)|lah|lok|lun|m(aar|ey|i[dr]|ul)|n[ae]h|nir|n[ou]s|od|ov|qah|qo|r(aan|ii|o|u)|s(haan|hul|len|trun|u)|tah|tiid|toor|ul|v(aaz|ah|en|iin?[gkr]|ur)|wuld|yah|yol|z(ah|ii|[ou][ln]|oor)

Спробуйте в Інтернеті!

На основі кількох простих спостережень:

  • Усі слова унікальні, незалежно від їх положення.
  • Жодне слово не є префіксом іншого слова.
  • Вхід гарантовано є дійсним.

Це означає, що ми можемо просто порахувати, скільки слів з’являється в рядку без накладання. Саме це робить регулярний вираз. Я спробував стиснути регулярний вираз трохи за рамками простого об'єднання всіх слів |(що було б 351 байт), але я впевнений, що це далеко не оптимально. Для початку я точно не експлуатував оптимально всі загальні частини. Але що ще важливіше, це можливо стиснути рядок ще більше, зробивши його збігом більше рядків, ніж дійсних слів, до тих пір, поки вони не можуть випадково збігатися з частиною дійсного слова (адже тоді вони просто ніколи не збігаються). Я впевнений, що доведеться автоматизувати стискання, щоб переконатися, що це оптимально.


2
Мартін Бюттнер переміг? Всі потрапляють у ваші бункери, кінець майже!
Cyoce

4
@Cyoce це нормально, я обіграв дві третини цієї іншої відповіді. ;)
Мартін Ендер

1

Perl 5, 28 байт

Кількість байтів включає в себе один для -p.

s/ou/oxo/;$_=()=/[aeiou]+/g

Викрадено прямо з dev-null . (Дякую, dev-null!)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.