Flesch-Kincaid czytelność algorytm zależy od środków liczby słów i liczą sylaby, z których żadna nie jest całkowicie obiektywne, lub łatwe do zautomatyzowania użycia komputera. Na przykład, czy „golf golfowy” z łącznikiem liczy się jako jedno słowo lub dwa? Czy słowo „milion” to dwie lub trzy sylaby? W tym zadaniu konieczne będzie przybliżenie, ponieważ dokładne liczenie zajmie zbyt dużo czasu, miejsca i, co najważniejsze, kodu.
Twoim zadaniem jest zbudowanie najmniejszego możliwego programu (tj. Funkcji) w dowolnym języku, który zajmie fragment czytania w języku angielskim (zakłada się, że jest w pełnych zdaniach), i obliczyć wskaźnik łatwości czytania Flescha z tolerancją ośmiu punktów (aby uwzględnić różnice w liczeniu sylab i liczeniu słów). Oblicza się go w następujący sposób:
FRE = 206.835 - 1.015 * (words per sentence) - 84.6 * (syllables per word)
Twój program musi być dostosowany do poniższych fragmentów referencyjnych, których wskaźniki zostały obliczone przy użyciu zliczania ręcznego:
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!
Indeks: 111,38 (64 sylaby w 62 słowach w 8 zdaniach)
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.
Indeks: 65,09 (74 sylaby w 55 słowach w 2 zdaniach)
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.
Indeks: 3,70 (110 sylab w 71 słowach w 1 zdaniu)
Jeśli masz inne fragmenty, dla których ręcznie policzyłeś sylaby i słowa i obliczyłeś indeks, możesz pokazać je jako weryfikację.
źródło
Odpowiedzi:
Perl 120 bajtów
Przykładowe I / O:
Zliczanie sylab odbywa się przy założeniu, że każda grupa samogłosek jest pojedynczą sylabą, z wyjątkiem samotnych samogłosek na końcu słowa, które są liczone tylko w dwóch trzecich przypadków; heurystyka, która wydaje się dość dokładna.
źródło
K&R c - 188
196199229znakówPo zmianie specyfikacji w celu określenia funkcji mogę uzyskać dużo c narzutu z licznika. Zmieniłem się również, aby użyć hakerskiego liczenia sylab Strigoidesa, co jest lepsze niż moje ulepszenie formuły i rozszerzone, aby poradzić sobie z przeliczaniem słów.
Po tym, jak znalazłem krótszy sposób na wykrycie samogłoski, na którym niestety opierałem się
stdchr
, miałem motywację, aby wycisnąć jeszcze więcej z nieco kręcącej się obrzydliwości, której używałem, aby nie musiałem się nudzić.Logika tutaj jest prostą maszyną stanu. Zlicza zdania według kropek, słowa według ciągów znaków alfabetycznych, a sylaby jako ciąg samogłosek (w tym y).
Musiałem trochę podważyć stałe, aby uzyskać właściwe liczby, ale pożyczyłem sztuczkę Strigoidesa polegającą na tym, że nie doceniłem sylab o ustalony ułamek.
Bez golfa , z komentarzami i niektórymi narzędziami do debugowania:
Wyjście: (przy użyciu rusztowania z długiej wersji, ale funkcja gry w golfa).
Niedociągnięcia:
!
lub a?
.there
liczy się jako dwa, a wiele słów kończących sięe
będzie liczonych o jeden za dużo), więc zastosowałem stały współczynnik korekty 96,9%.[
i{
co oczywiście nie jest właściwe.Rzeczy do zobaczenia:
Jestem (chwilowo) przed obydwoma rozwiązaniami w Pythonie, nawet jeśli śledzę perla.
Zdobądź mnóstwo okropnych rzeczy, które zrobiłem dla wykrywania samogłosek. Ma to sens, jeśli zapisujesz reprezentacje ASCII w formacie binarnym i czytasz komentarz w długiej wersji.
źródło
Python,
202194188184171167 znakówNajpierw uzyskaj całkowitą liczbę słów, dzieląc wzdłuż spacji i znaków nowej linii:
Następnie formuła. Liczby zdań i sylab są używane tylko raz, więc są osadzone w tym wyrażeniu.
Zdania to po prostu podział wejściowy wraz
.
z odfiltrowanymi znakami nowej linii:Sylaby składają się z wejścia podzielonego wzdłuż non-samogłosek, z usuniętymi spacjami. To wydaje się konsekwentnie nieco zawyżać liczbę sylab, więc musimy go zmniejszyć (wydaje się, że robi to około .98):
202 -> 194:
len(x)-2
zamiastlen(x[1:-1])
. Usunięto niepotrzebne wsporniki. Uczyniono sylabę wyrażeń regularnych bez rozróżniania wielkości liter194 -> 188: Plik był wcześniej zapisywany jako dos, a nie w formacie uniksowym, co spowodowało, że
wc -c
nowe znaki były liczone jako dwa znaki. Ups188 -> 184: Pozbądź się tych paskudnych
x for x in ... if x!=...
, przechowując wynik pośredni i odejmującx.count(...)
184 -> 171: Usuń wejście / wyjście i przekonwertuj na funkcję
171 -> 167: Wstaw
len(x)-x.count(...)
s do wzoruźródło
Python 380 znaków
Jest to dość długie rozwiązanie, ale działa wystarczająco dobrze, przynajmniej pod warunkiem, że 3 testy.
Kod testowy
Wynik -
Użyłem stąd licznika sylab - Liczenie sylab
Bardziej czytelna wersja jest dostępna tutaj
źródło
if len(w)>2 and w[-1]=='e'and w[-2]not in v and w[-3]in v:c-= 1
Prosty, ale dobre przybliżenie. Lubię to.JavaScript, 191 bajtów
Pierwszy przypadek testowy daje 112,9 (poprawna odpowiedź to 111,4, wyłączono o 1,5 punktu)
Drugi przypadek testowy daje 67,4 (poprawna odpowiedź to 65,1, wyłączono o 2,3 punktu)
Trzeci przypadek testowy daje 1,7 (poprawna odpowiedź to 3,7, wyłączone o 2,0 punkty)
źródło