Ile słów mocy krzyczałem?

10

W Skyrim postać gracza może użyć potężnych magicznych krzyków (Thu'ums), aby osiągnąć swoje cele. Każdy krzyk składa się z trzech słów, jednak gracz może użyć pierwszego lub dwóch słów, aby osiągnąć ten sam efekt przy mniejszej mocy, ale przy krótszym czasie odnowienia.

Biorąc pod uwagę małą literę ASCII Thu'um bez interpunkcji i spacji , zwróć liczbę zawartych w niej słów mocy.

Przykład:

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

Dane wejściowe zawsze będą ciągami ASCII pisanymi małymi literami, utworzonymi przez wzięcie jednego z poniższych okrzyków, wybranie pierwszych 1, 2 lub 3 słów z tego krzyku i połączenie słów w kolejności.

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

Tak więc fus, fusroi fusrodahwszystkie są poprawnymi danymi wejściowymi, ale fusroviirnie dlatego, że używa słów z mieszanych krzyków, a rodahnie dlatego, że nie jest to przedrostek krzyku. Nie musisz również obsługiwać pustych danych wejściowych.


Najkrótszy kod w bajtach wygrywa.

orlp
źródło
1
Podam ciasteczko dla pierwszej osoby, która uruchomi ten algorytm w każdej linii Song of the Dragonborn (zwanej plebsem „motywem skyrim”)
Cyoce

Odpowiedzi:

17

Retina, 78 42 15 14 bajtów

ul
xo
[aeiou]+

Wypróbuj online

tiidkloul to jedyne słowo, które nie ma takiej samej liczby sekwencji samogłosek jak liczba, która ma zostać wydrukowana. Dlatego musimy dopasować słowo, aby nadać mu dodatkową sekwencję samogłosek. oupasuje tylko tiidkl ou L i można następnie zastąpić ou z okso , która tworzy dodatkowej sekwencji.

Moje początkowe podejście nie było takie proste, ale polegało na usunięciu wszystkich spółgłosek, następnie usunięciu kilku sekwencji samogłoskowych ( ai|ii|aa|...), a następnie zliczeniu liter. Ale dzięki @Martin Büttner za myślenie [aeiou]+zamiast tego.

andlrc
źródło
Zwraca 3 dla fusroviir, który został wyraźnie wymieniony jako niepoprawne wejście.
atk
1
@atk Zapytałem OP, czy byłyby to nieprawidłowe dane wejściowe. Odpowiedź była przecząca.
andlrc
1

Retina , 313 bajtów

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)

Wypróbuj online!

Na podstawie kilku prostych obserwacji:

  • Wszystkie słowa są unikalne, niezależnie od ich pozycji.
  • Żadne słowo nie jest przedrostkiem innego słowa.
  • Dane wejściowe są gwarantowane.

Oznacza to, że możemy po prostu policzyć, ile słów pojawia się w ciągu bez nakładania się. To właśnie robi regex. Próbowałem trochę skompresować regex poza łączeniem wszystkich słów |(co byłoby 351 bajtami), ale jestem pewien, że nie jest to optymalne. Na początek zdecydowanie nie wykorzystałem optymalnie wszystkich popularnych części. Ale co ważniejsze, można jeszcze bardziej skompresować ciąg, dopasowując więcej ciągów niż prawidłowe słowa, o ile nie mogą przypadkowo dopasować części prawidłowego słowa (ponieważ wtedy po prostu nigdy nie zostaną dopasowane). Jestem pewien, że należałoby zautomatyzować kompresję, aby mieć pewność, że jest optymalna.

Martin Ender
źródło
2
Martin Büttner został wyrzucony z golfa? Wszyscy wsiadają do bunkrów, koniec jest blisko!
Cyoce
4
@Cyoce jest w porządku, grałem w golfa dwie trzecie tej drugiej odpowiedzi. ;)
Martin Ender
1

Perl 5, 28 bajtów

Liczba bajtów obejmuje jeden dla -p.

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

Skradzione prosto z dev-null . (Dzięki, dev-null!)

msh210
źródło