Флеш-Кинкейд читаемость алгоритм зависит от мер количества слов и слогов подсчета, ни один из которых является полностью объективным, или легко автоматизирован с помощью компьютера. Например, считается ли «код-гольф» с дефисом одним словом или двумя? Является ли слово «миллион» двумя или тремя слогами? В этой задаче вам нужно будет приблизиться, так как для точного подсчета потребуется слишком много времени, места и, самое главное, кода.
Ваша задача состоит в том, чтобы создать наименьшую возможную программу (т.е. функцию) на любом языке, которая будет проходить отрывок для чтения на английском языке (предполагается, что он состоит из полных предложений), и рассчитать индекс легкости чтения Flesch с допуском в восемь пунктов (для учета вариации в подсчете слогов и слов). Он рассчитывается следующим образом:
FRE = 206.835 - 1.015 * (words per sentence) - 84.6 * (syllables per word)
Ваша программа должна быть приведена в соответствие с приведенными ниже ссылочными отрывками, индексы которых были рассчитаны с использованием ручного подсчета:
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!
Индекс: 111,38 (64 слога в 62 словах в 8 предложениях)
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.
Индекс: 65.09 (74 слога в 55 словах в 2 предложениях)
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.
Индекс: 3,70 (110 слогов в 71 слове в 1 предложении)
Если у вас есть другие отрывки, для которых вы вручную подсчитали слоги и слова и рассчитали индекс, вы можете показать их как подтверждение.
источник
Ответы:
Perl 120 байт
Пример ввода / вывода:
Подсчет слогов осуществляется при условии, что каждый кластер гласных является одним слогом, за исключением одиночных гласных в конце слова, которые учитываются только в двух третях времени; эвристика, которая кажется довольно точной.
источник
K & R c - 188
196199229знаковС измененной спецификацией, чтобы указать функцию, я могу получить большую часть накладных расходов c из подсчета. Также я перешел на использование метода подсчета слогов Strigoides, который лучше, чем моя настройка формулы, и расширен, чтобы справиться с перерасчетом слов.
После того, как я нашел более короткий способ обнаружения гласных, который, к сожалению, был основан
stdchr
, у меня появился стимул выжать еще несколько из мерзости, которую я использовал, чтобы не скучать.Логика здесь - простой конечный автомат. Он считает предложения только по периодам, слова по строкам буквенных символов и слоги как строки гласных (включая y).
Мне пришлось немного растянуть константы, чтобы получить правильные цифры, но я позаимствовал уловку Стригоидеса, заключающуюся в недоучете слогов на фиксированную дробь.
Без гольфа , с комментариями и некоторыми инструментами отладки:
Вывод: (с использованием эшафот из длинной версии, но с функцией гольфа)
Недостаточность:
!
или a?
.there
, считается как два, а многие слова, оканчивающиеся на,e
будут считаться слишком много), поэтому я применил постоянный коэффициент коррекции 96,9%.[
и{
, что явно не правильно.На что посмотреть:
Я (на мгновение) опередил оба решения Python здесь, даже если я тяну за Perl.
Получите груз ужасной вещи, которую я сделал для обнаружения гласных. Имеет смысл, если вы записываете представления ASCII в двоичном виде и читаете комментарий в длинной версии.
источник
Питон,
202194188184171167 символовВо-первых, получите общее количество слов, разделив их по пробелам и новым строкам:
Тогда формула. Количество предложений и слогов используется только один раз, поэтому они включены в это выражение.
Предложения - это просто входные данные
.
, отфильтрованные по новой строке:Слоги состоят из входных данных, разделенных по гласным, с удаленными пробелами. Похоже, что это постоянно немного переоценивает количество слогов, поэтому мы должны уменьшить его (примерно 0,98, кажется, это сделать):
202 -> 194:
len(x)-2
а неlen(x[1:-1])
. Убраны лишние скобки. Сделано регулярное выражение слога без учета регистра194 -> 188: файл был ранее сохранен в формате dos, а не в формате unix, в результате чего
wc -c
символы новой строки считались двумя символами. Упс.188 -> 184: избавиться от этих неприятных
x for x in ... if x!=...
с, сохраняя промежуточный результат и вычитаяx.count(...)
184 -> 171: удалить ввод / вывод и преобразовать в функцию
171 -> 167: вставить
len(x)-x.count(...)
s в формулуисточник
Python 380 символов
Это довольно длинное решение, но оно работает достаточно хорошо, по крайней мере, из трех тестовых случаев, если это так.
Тестовый код
Результат -
Отсюда я использовал счетчик слогов - Подсчет слогов
Более читаемая версия доступна здесь
источник
if len(w)>2 and w[-1]=='e'and w[-2]not in v and w[-3]in v:c-= 1
Простой, но хорошее приближение. Мне это нравится.Javascript, 191 байт
Первый тест дает 112,9 (правильный ответ 111,4, отклонение на 1,5 балла)
Второй тест дает 67,4 (правильный ответ 65,1, отклонение на 2,3 балла)
Третий тест дает 1,7 (правильный ответ 3,7, отклонение на 2,0 балла)
источник