Combien de mots de pouvoir ai-je crié?

10

Dans Skyrim, le personnage du joueur peut utiliser de puissants cris magiques (Thu'ums) pour atteindre ses objectifs. Chaque cri se compose de trois mots, cependant, le joueur peut utiliser le premier ou les deux premiers mots pour obtenir le même effet avec moins de puissance mais avec un temps de recharge plus court.

Étant donné une phrase ASCII Thu'um en minuscule sans ponctuation ni espaces , renvoyez le nombre de mots de puissance qu'elle contient.

Exemple:

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

L'entrée sera toujours une chaîne ASCII minuscule formée en prenant l'un des cris ci-dessous, en choisissant les 1, 2 ou 3 premiers mots de ce cri et en concaténant les mots dans l'ordre.

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

Alors fus, fusroet fusrodahsont toutes les entrées valides, mais fusroviirne sont pas , car il utilise des mots de cris mixtes, et rodahest pas parce que ce n'est pas un préfixe d'un cri. Vous n'avez pas non plus à gérer l'entrée de chaîne vide.


Le code le plus court en octets gagne.

orlp
la source
1
Je donnerai un cookie pour la première personne à exécuter cet algorithme sur chaque ligne du Chant du Dragonborn (connu sous le nom de "thème skyrim" par plèbe)
Cyoce

Réponses:

17

Rétine, 78 42 15 14 octets

ul
xo
[aeiou]+

Essayez-le en ligne

tiidkloul est le seul mot qui n'a pas la même quantité de séquences de voyelles que le nombre censé être imprimé. Par conséquent, nous devons faire correspondre le mot pour lui donner une séquence de voyelles supplémentaire. oune correspondra qu'à tiidkl ou l et nous pouvons alors remplacer ou par oxo qui crée la séquence supplémentaire.

Mon approche initiale n'était pas aussi simple, mais consistait à supprimer toutes les consonnes, puis à supprimer quelques séquences de voyelles ( ai|ii|aa|...) et enfin à compter le nombre de lettres. Mais merci à @Martin Büttner d' avoir pensé à la [aeiou]+place.

andlrc
la source
Renvoie 3 pour fusroviir, qui était explicitement répertorié comme entrée non valide.
ATK
1
@atk J'ai demandé à OP si leur entrée serait invalide. La réponse était non.
andlrc
1

Rétine , 313 octets

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)

Essayez-le en ligne!

Sur la base de quelques observations simples:

  • Tous les mots sont uniques, quelle que soit leur position.
  • Aucun mot n'est le préfixe d'un autre mot.
  • L'entrée est garantie pour être valide.

Cela signifie que nous pouvons simplement compter le nombre de mots qui apparaissent dans la chaîne sans se chevaucher. C'est exactement ce que fait une expression régulière. J'ai essayé de compresser le regex un peu au-delà de la simple concaténation de tous les mots avec |(qui serait de 351 octets), mais je suis sûr que c'est loin d'être optimal. Pour commencer, je n'ai certainement pas exploité toutes les parties communes de manière optimale. Mais plus important encore, il est possible de compresser la chaîne encore plus en la faisant correspondre à plus de chaînes que de mots valides, tant que ceux-ci ne peuvent pas correspondre accidentellement à une partie d'un mot valide (car ils ne seront alors jamais mis en correspondance). Je suis quasiment sûr qu'il faudrait automatiser la compression pour vraiment être sûr qu'elle est optimale.

Martin Ender
la source
2
Martin Büttner a été battu? Tout le monde monte dans vos bunkers, la fin est proche!
Cyoce
4
@Cyoce ça va, j'ai joué aux deux tiers de cette autre réponse. ;)
Martin Ender
1

Perl 5, 28 octets

Le nombre d'octets comprend un pour -p.

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

Volé directement à dev-null . (Merci, dev-null!)

msh210
la source