Entrée: Vous recevrez une chaîne contenant un seul mot anglais. Toutes les lettres seront en minuscules et il n'y aura pas de caractères non alphabétiques dans la chaîne.
Sortie: Vous retournerez un entier de 1 à 7 représentant le nombre de syllabes que vous pensez être dans le mot.
Notation: votre programme sera exécuté par rapport à tous les mots trouvés dans ce référentiel . Si vous obtenez des N
mots corrects et que votre programme est M
volumineux, alors votre score est N-(M*10)
. Le score le plus élevé l'emporte.
Pour générer mon nombre syllabe, je ce que ma liste de mots et ce à compter les syllabes.
code-challenge
word
Nathan Merrill
la source
la source
resume
par exemple ...Réponses:
Ruby, 8618 correct (91,1%), 53 octets, 8618 - 10 * 53 = score 8088
Il s'agit d'une fonction Ruby anonyme qui utilise des expressions rationnelles pour compter les syllabes.
La fonction ajoute une syllabe pour chaque instance de:
e
voyelles, suivie de zéro de pluse
se
qui ne fait pas partie d'un suivied
ouely
, à l'exception du suivited
ouded
sle
Une analyse
L'idée de base est de compter les séries de voyelles, mais ce n'est pas très précis en soi (il
[aeiouy]+
est correct à 74%). La raison principale en est le silencee
, qui modifie le son de voyelle précédent sans être prononcé lui-même. Par exemple, le motslate
a deux voyelles mais une seule syllabe.Pour y faire face, nous retirons
e
la première partie de l'expression rationnelle et la traitons séparément. Détecter lese
s silencieux est difficile, mais j'ai trouvé deux cas où ils se produisent souvent:ed
(sauf s'il s'agit d'unted
ouded
commesettled
ousaddled
),evy
(par exemplelovely
)Ces cas sont spécifiquement exclus de ce qui serait autrement
e.
.La raison de l'
.
entréee(?!d$|ly).
est de consommer le caractère suivant s'il y a une voyelle double (par exempleea
ouee
), et de sorte qu'àe
la fin du mot ne soit pas compté. Cependant, une fuitele
est généralement prononcée, de sorte qu'elle est ajoutée à nouveau.Enfin, les voyelles sont comptées comme une syllabe. Bien que cela ne soit pas toujours le cas (par exemple
curious
), il est souvent difficile de déterminer s'il existe plusieurs syllabes. Prenez leia
decelestial
etspatial
, à titre d'exemple.Programme de test
Je ne connais pas vraiment Ruby, donc je ne sais pas à quel point il peut être joué au golf. J'ai réussi à rassembler un programme de test en consultant beaucoup de SO cependant:
la source
e
" donne 6638 (7158 correct)Python3, 7935 - 10 * 71 = 7225
Ma réponse rapide et sale: comptez les séries de voyelles consécutives, mais supprimez tout e final en premier.
Après avoir supprimé les e, cela remplace les voyelles par
x
et tous les autres caractères par un espace. Le résultat est joint à nouveau dans une chaîne, puis divisé en espaces blancs. Idéalement, les espaces au début et à la fin sont ignorés (par exemple," x xx ".split()
donne["x","xx"]
). La longueur de la liste résultante est donc le nombre de groupes de voyelles.La réponse originale de 83 octets ci-dessous était plus précise car elle ne supprimait qu'un seul e à la fin. Le plus récent a donc des problèmes pour des mots comme
bee
; mais le code raccourci l'emporte sur cet effet.Programme de test:
Évidemment, c'était trop sale et pas assez rapide pour battre la réponse Ruby du Sp3000. ; ^)
la source
->s{s.scan(/([aiouy]|e(?!$))+/).size}
obtient 7583. 84% est assez impressionnant pour quelque chose de si simple.Perl, 8145 - 3 * 30 = 7845
Utilisation des listes d'avant les commits récents.
la source
Python, 5370-10 * 19 = 5180
Ce programme suppose simplement que des mots plus longs signifient plus de syllabes.
Le programme de testeur que j'utilise est:
la source
len(x)/6
place (5377-190 = 5187).readlines()
inclut la nouvelle ligne dans le résultat. Donc le vôtre l'est en fait(len(x)+1)/7+1
. Vous devez utiliser à laread().split('\n')
place. Bien que j'aie eu 5352 pour cette formule, cependant.