Сколько слов силы я крикнул?

10

В Skyrim персонаж игрока может использовать мощные магические крики (Ту'умс) для достижения своих целей. Каждый крик состоит из трех слов, однако игрок может использовать первые одно или два слова для достижения того же эффекта с меньшей мощностью, но с более коротким временем восстановления.

Получив строчную 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не потому, что это не префикс крика. Вам также не нужно обрабатывать ввод пустой строки.


Самый короткий код в байтах побеждает.

orlp
источник
1
Я дам печенье для первого человека, который запустит этот алгоритм в каждой строке Песни Дракона (известная как «тема небесного неба» плебса)
Cyoce

Ответы:

17

Сетчатка, 78 42 15 14 байт

ul
xo
[aeiou]+

Попробуйте онлайн

tiidkloul - единственное слово, которое не имеет такое же количество последовательностей гласных, как число, которое должно быть напечатано. Поэтому нам нужно сопоставить слово, чтобы придать ему дополнительную последовательность гласных. ouбудет соответствовать только tiidkl ou l, и тогда мы можем заменить ou на oxo, что создаст дополнительную последовательность.

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

andlrc
источник
Возвращает 3 для fusroviir, который был явно указан как неверный ввод.
atk
1
@atk Я спросил OP, будет ли их ввод недействительным. Ответ был нет.
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
@ Да, все в порядке, я ответил на две трети другим ответом. ;)
Мартин Эндер
1

Perl 5, 28 байт

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

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

Украдены прямо из dev-null . (Спасибо, dev-null!)

msh210
источник