L' algorithme de lisibilité Flesch-Kincaid dépend des mesures du nombre de mots et du nombre de syllabes, qui ne sont ni entièrement objectives, ni facilement automatisables à l'aide d'un ordinateur. Par exemple, "code-golf", avec le tiret, compte-t-il pour un ou deux mots? Le mot «million» est-il composé de deux ou trois syllabes? Dans cette tâche, vous devrez approximer, car compter exactement prendra trop de temps, d'espace et, surtout, de code.
Votre tâche est de créer le plus petit programme possible (c'est-à-dire une fonction) dans n'importe quelle langue qui prendra un passage de lecture en anglais (supposé être en phrases complètes), et de calculer l'indice Flesch Reading Ease à une tolérance de huit points (pour tenir compte de variations dans le comptage des syllabes et des mots). Il est calculé comme suit:
FRE = 206.835 - 1.015 * (words per sentence) - 84.6 * (syllables per word)
Votre programme doit être aligné sur les passages de référence ci-dessous, dont les indices ont été calculés à l'aide d'un comptage manuel:
I would not, could not, in the rain.
Not in the dark, not on a train.
Not in a car, not in a tree.
I do not like them, Sam, you see.
Not in a house, not in a box.
Not with a mouse, not with a fox.
I will not eat them here or there.
I do not like them anywhere!
Index: 111.38 (64 syllabes en 62 mots en 8 phrases)
It was a bright cold day in April, and the clocks were striking thirteen.
Winston Smith, his chin nuzzled into his breast in an effort to escape
the vile wind, slipped quickly through the glass doors of Victory Mansions,
though not quickly enough to prevent a swirl of gritty dust from entering
along with him.
Index: 65.09 (74 syllabes en 55 mots en 2 phrases)
When in the Course of human events, it becomes necessary for one people to
dissolve the political bands which have connected them with another, and to
assume among the powers of the earth, the separate and equal station to
which the Laws of Nature and of Nature's God entitle them, a decent respect
to the opinions of mankind requires that they should declare the causes
which impel them to the separation.
Index: 3.70 (110 syllabes en 71 mots en 1 phrase)
Si vous avez d'autres passages pour lesquels vous avez compté manuellement les syllabes et les mots et calculé l'index, vous pouvez les montrer comme vérification.
la source
Réponses:
Perl 120 octets
Exemple d'E / S:
Le comptage des syllabes se fait en supposant que chaque groupe de voyelles est une syllabe unique, à l'exception des voyelles isolées à la fin d'un mot, qui ne sont comptées que les deux tiers du temps; une heuristique qui semble assez précise.
la source
K&R c - 188
196199 199229caractèresAvec la spécification modifiée pour spécifier une fonction, je peux obtenir une grande partie de la surcharge c du décompte. Changement également pour utiliser le hack de comptage de syllabes de Strigoides qui est meilleur que mon ajustement de formule et étendu pour faire face au comptage excessif des mots.
Après avoir trouvé un moyen plus court de faire la détection des voyelles, qui était malheureusement basé sur
stdchr
, j'ai été incité à en extraire un peu plus de l'abomination bidirectionnelle que j'utilisais pour ne pas avoir à être ennuyeux.La logique ici est une simple machine à états. Il compte les phrases par périodes seulement, les mots par chaînes de caractères alphabétiques et les syllabes comme chaînes de voyelles (y compris y).
J'ai dû traîner un peu les constantes pour obtenir les bonnes figures, mais j'ai emprunté le tour de Strigoides consistant à sous-estimer les syllabes par une fraction fixe.
Non golfé , avec des commentaires et quelques outils de débogage:
Sortie: (en utilisant l'échafaudage de la version longue, mais la fonction golfée.)
Lacunes:
!
ou un?
.there
est compté comme deux et de nombreux mots se terminant pare
seront comptés un de trop), j'ai donc appliqué un facteur constant de correction de 96,9%.[
et{
, ce qui n'est clairement pas correct.Choses à regarder:
Je suis (momentanément) en avance sur les deux solutions python ici, même si je suis à la traîne de Perl.
Obtenez une charge de la chose horrible que j'ai faite pour détecter les voyelles. Cela a du sens si vous écrivez les représentations ASCII en binaire et lisez le commentaire dans la version longue.
la source
Python,
202194188184171 171167 caractèresTout d'abord, obtenez le nombre total de mots en divisant le long des espaces et des retours à la ligne:
Ensuite, la formule. Les décomptes de phrases et de syllabes ne sont utilisés qu'une seule fois, ils sont donc intégrés dans cette expression.
Les phrases sont simplement l'entrée divisée
.
, avec des retours à la ligne filtrés:Les syllabes consistent en une entrée divisée le long de non-voyelles, avec des espaces supprimés. Cela semble constamment légèrement surestimer le nombre de syllabes, nous devons donc l'ajuster (environ 0,98 semble le faire):
202 -> 194:
len(x)-2
plutôt quelen(x[1:-1])
. Suppression des supports inutiles. Rendu syllabe insensible à la casse194 -> 188: Le fichier était précédemment enregistré au format DOS plutôt qu'au format de fichier Unix, ce
wc -c
qui fait compter les sauts de ligne comme deux caractères. Oups.188 -> 184: Débarrassez-vous de ces méchants
x for x in ... if x!=...
en stockant le résultat intermédiaire et en soustrayantx.count(...)
184 -> 171: Supprimer l'entrée / sortie et convertir en fonction
171 -> 167: insérer le
len(x)-x.count(...)
s dans la formulela source
Python 380 caractères
C'est une solution assez longue, mais elle fonctionne assez bien, au moins des 3 cas de test à condition qu'elle le fasse.
Code de test
Résultat -
J'ai utilisé le compteur de syllabes d'ici - Compter les syllabes
Une version plus lisible est disponible ici
la source
if len(w)>2 and w[-1]=='e'and w[-2]not in v and w[-3]in v:c-= 1
Simple d'esprit mais une bonne approximation. Je l'aime.Javascript, 191 octets
Le premier cas de test donne 112,9 (la bonne réponse est 111,4, en baisse de 1,5 point)
Le deuxième test élémentaire donne 67,4 (la bonne réponse est 65,1, en retrait de 2,3 points)
Le troisième cas de test donne 1,7 (la bonne réponse est 3,7, diminuée de 2,0 points)
la source