Der Flesch-Kincaid-Lesbarkeitsalgorithmus hängt von den Maßen der Wortzahl und der Silbenzahl ab, von denen keines vollständig objektiv oder mit einem Computer leicht automatisierbar ist. Zählt beispielsweise "Code-Golf" mit dem Bindestrich als ein oder zwei Wörter? Ist das Wort "Million" zwei oder drei Silben? In dieser Aufgabe müssen Sie eine Annäherung vornehmen, da das genaue Zählen zu viel Zeit, Platz und vor allem Code beansprucht.
Ihre Aufgabe ist es, das kleinstmögliche Programm (dh eine Funktion) in einer beliebigen Sprache zu erstellen, die eine englische Lesepassage (angenommen in vollständigen Sätzen) enthält, und den Flesch Reading Ease-Index mit einer Toleranz von acht Punkten zu berechnen (zu berücksichtigen) Variationen bei der Silbenzählung und der Wortzählung). Es wird wie folgt berechnet:
FRE = 206.835 - 1.015 * (words per sentence) - 84.6 * (syllables per word)
Ihr Programm muss an den folgenden Referenzpassagen ausgerichtet sein, deren Indizes mit manueller Zählung berechnet wurden:
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 Silben in 62 Wörtern in 8 Sätzen)
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 Silben in 55 Wörtern in 2 Sätzen)
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 Silben in 71 Wörtern in 1 Satz)
Wenn Sie andere Passagen haben, für die Sie die Silben und Wörter manuell gezählt und den Index berechnet haben, können Sie diese als Verifikation anzeigen.
quelle
Antworten:
Perl 120 Bytes
Beispiel I / O:
Das Zählen von Silben erfolgt unter der Annahme, dass jeder Vokalcluster eine einzige Silbe ist, mit Ausnahme von einsamen Vokalen am Ende eines Wortes, die nur zwei Drittel der Zeit gezählt werden. eine Heuristik, die ziemlich genau zu sein scheint.
quelle
K & R c - 188
196199229ZeichenWenn die Spezifikation geändert wird, um eine Funktion anzugeben, kann ich einen Großteil des c-Overheads aus der Zählung herausholen. Es wurde auch geändert, um Strigoides 'Silbenzähl-Hack zu verwenden, der besser ist als meine Formeloptimierung und erweitert, um das Überzählen von Wörtern zu behandeln.
Nachdem ich einen kürzeren Weg gefunden hatte, um die
stdchr
Vokalerkennung durchzuführen, der leider zugrunde lag , hatte ich den Anreiz, ein paar mehr aus dem Gräuel herauszupressen, den ich benutzt hatte, damit ich mich nicht langweilen musste.Die Logik hier ist eine einfache Zustandsmaschine. Es werden nur Sätze nach Punkten, Wörter nach Buchstabenfolgen und Silben als Vokalfolgen (einschließlich y) gezählt.
Ich musste die Konstanten ein wenig verändern, um die richtigen Zahlen zu erhalten, aber ich habe mir Strigoides 'Trick geliehen, die Silben nur um einen festen Bruchteil zu unterzählen.
Ohne Golf , mit Kommentaren und einigen Debugging-Tools:
Ausgabe: (mit dem Gerüst aus der langen Version, aber die Golffunktion.)
Mängel:
!
oder ein hat?
.there
viele Wörter gezählt (zum Beispiel werden zwei und viele Wörter gezählt, die auf enden)e
, werden eins zu viele gezählt), also habe ich einen konstanten Korrekturfaktor von 96,9% angewendet.[
und{
das ist eindeutig nicht richtig.Dinge zu sehen:
Ich bin hier (momentan) beiden Python-Lösungen voraus, auch wenn ich dem Perl nachlaufe.
Holen Sie sich eine Ladung von dem schrecklichen, was ich getan habe, um Vokale zu entdecken. Es ist sinnvoll, wenn Sie die ASCII-Darstellungen in Binärform schreiben und den Kommentar in der Langfassung lesen.
quelle
Python,
202194188184171167 ZeichenErmitteln Sie zunächst die Gesamtzahl der Wörter, indem Sie Leerzeichen und Zeilenumbrüche aufteilen:
Dann die Formel. Satz- und Silbenzahlen werden nur einmal verwendet und sind daher in diesen Ausdruck eingebettet.
Sätze sind einfach die Eingabe, zusammen
.
mit herausgefilterten Zeilenumbrüchen:Silben bestehen aus der Eingabe entlang von Nicht-Vokalen, wobei Leerzeichen entfernt werden. Dies scheint die Anzahl der Silben durchweg leicht zu überschätzen, so dass wir sie nach unten korrigieren müssen (ungefähr .98 scheint dies zu tun):
202 -> 194:
len(x)-2
eher alslen(x[1:-1])
. Unnötige Klammern entfernt. Regex für Silben ohne Berücksichtigung der Groß- und Kleinschreibung194 -> 188: Die Datei wurde zuvor im
wc -c
DOS- und nicht im UNIX- Dateiformat gespeichert, sodass Zeilenumbrüche als zwei Zeichen gezählt wurden. Hoppla.188 -> 184: Werden Sie diese unangenehmen
x for x in ... if x!=...
s los, indem Sie das Zwischenergebnis speichern und subtrahierenx.count(...)
184 -> 171: Ein- / Ausgabe entfernen und in Funktion konvertieren
171 -> 167: Fügen Sie das
len(x)-x.count(...)
s in die Formel einquelle
Python 380 Zeichen
Dies ist eine ziemlich lange Lösung, aber sie funktioniert gut genug, zumindest in den 3 Testfällen, sofern dies der Fall ist.
Code testen
Ergebnis -
Ich habe den Silbenzähler von hier verwendet - Zählen von Silben
Eine besser lesbare Version finden Sie hier
quelle
if len(w)>2 and w[-1]=='e'and w[-2]not in v and w[-3]in v:c-= 1
Einfältig, aber eine gute Annäherung. Ich mag das.Javascript, 191 Bytes
Erster Testfall ergibt 112,9 (richtige Antwort ist 111,4, ab 1,5 Punkte)
Zweiter Testfall ergibt 67,4 (richtige Antwort ist 65,1, Abweichung um 2,3 Punkte)
Dritter Testfall ergibt 1,7 (richtige Antwort ist 3,7, ab 2,0 Punkte)
quelle