Wie viele Worte der Macht habe ich geschrien?

10

In Skyrim kann der Spielercharakter mächtige magische Rufe (Thu'ums) verwenden, um seine Ziele zu erreichen. Jeder Schrei besteht aus drei Wörtern. Der Spieler kann jedoch die ersten ein oder zwei Wörter verwenden, um den gleichen Effekt mit weniger Kraft, aber einer kürzeren Abklingzeit zu erzielen.

Geben Sie bei einer ASCII-Thu'um-Phrase in Kleinbuchstaben ohne Interpunktion oder Leerzeichen die Anzahl der darin enthaltenen Potenzwörter zurück .

Beispiel:

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

Die Eingabe ist immer eine ASCII-Zeichenfolge in Kleinbuchstaben, die gebildet wird, indem einer der folgenden Shouts verwendet, die ersten 1, 2 oder 3 Wörter aus diesem Shout ausgewählt und die Wörter der Reihe nach verkettet werden.

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

Also fus, fusround fusrodahsind alle gültigen Eingaben, aber fusroviirnicht, weil es Wörter aus gemischten Schreien verwendet, und rodahnicht, weil es kein Präfix eines Schreis ist. Sie müssen auch die Eingabe der leeren Zeichenfolge nicht verarbeiten.


Der kürzeste Code in Bytes gewinnt.

orlp
quelle
1
Ich werde ein Cookie für die erste Person geben, die diesen Algorithmus in jeder Zeile des Liedes des Drachengeborenen ausführt (bekannt als "Skyrim-Thema" von Plebs)
Cyoce

Antworten:

17

Retina, 78 42 15 14 Bytes

ul
xo
[aeiou]+

Probieren Sie es online aus

tiidkloul ist das einzige Wort, das nicht die gleiche Anzahl von Vokalsequenzen enthält wie die Nummer, die gedruckt werden soll. Daher müssen wir das Wort anpassen, um ihm eine zusätzliche Vokalsequenz zu geben. ounur wird tiidkl entsprechen ou l , und wir können dann ersetzen ou mit Oxo , der die zusätzliche Sequenz erzeugt.

Mein anfänglicher Ansatz war nicht so einfach, sondern bestand darin, alle Konsonanten zu entfernen, dann einige Vokalsequenzen ( ai|ii|aa|...) zu entfernen und schließlich die Anzahl der Buchstaben zu zählen. Aber danke an @Martin Büttner für das Nachdenken [aeiou]+.

andlrc
quelle
Gibt 3 für fusroviir zurück, das explizit als ungültige Eingabe aufgeführt wurde.
Atk
1
@atk Ich fragte OP, ob ihre Eingabe ungültig wäre. Die Antwort war nein.
andlrc
1

Netzhaut , 313 Bytes

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)

Probieren Sie es online aus!

Basierend auf ein paar einfachen Beobachtungen:

  • Alle Wörter sind unabhängig von ihrer Position einzigartig.
  • Kein Wort ist ein Präfix eines anderen Wortes.
  • Die Eingabe ist garantiert gültig.

Das heißt, wir können einfach zählen, wie viele Wörter in der Zeichenfolge ohne Überlappung erscheinen. Genau das macht ein Regex. Ich habe versucht, den regulären Ausdruck ein wenig zu komprimieren, ohne nur alle Wörter mit zu verketten |(das wären 351 Bytes), aber ich bin sicher, dass dies alles andere als optimal ist. Zunächst einmal habe ich definitiv nicht alle gängigen Teile optimal genutzt. Noch wichtiger ist jedoch, dass die Zeichenfolge noch weiter komprimiert werden kann, indem mehr Zeichenfolgen als gültige Wörter übereinstimmen, sofern diese nicht versehentlich mit einem Teil eines gültigen Wortes übereinstimmen (da sie dann einfach nie übereinstimmen). Ich bin mir ziemlich sicher, dass man die Komprimierung automatisieren müsste, um wirklich sicher zu sein, dass sie optimal ist.

Martin Ender
quelle
2
Martin Büttner wurde outgolfed? Jeder kommt in deine Bunker, das Ende ist nahe!
Cyoce
4
@Cyoce es ist okay, ich habe zwei Drittel von dieser anderen Antwort Golf gespielt. ;)
Martin Ender
1

Perl 5, 28 Bytes

Die Byteanzahl enthält eine für -p.

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

Direkt von dev-null gestohlen . (Danke, dev-null!)

msh210
quelle