El algoritmo de legibilidad de Flesch-Kincaid depende de las medidas del recuento de palabras y el recuento de sílabas, ninguno de los cuales es completamente objetivo o fácilmente automatizable utilizando una computadora. Por ejemplo, ¿"code-golf", con el guión, cuenta como una o dos palabras? ¿Es la palabra "millón" dos o tres sílabas? En esta tarea, deberá aproximarse, ya que contar exactamente tomará demasiado tiempo, espacio y, lo más importante, código.
Su tarea es construir el programa más pequeño posible (es decir, una función) en cualquier idioma que tome un pasaje de lectura en inglés (se supone que está en oraciones completas), y calcular el índice Flesch Reading Ease con una tolerancia de ocho puntos (para tener en cuenta variaciones en el conteo de sílabas y el conteo de palabras). Se calcula de la siguiente manera:
FRE = 206.835 - 1.015 * (words per sentence) - 84.6 * (syllables per word)
Su programa debe estar alineado con los pasajes de referencia a continuación, cuyos índices se calcularon utilizando el conteo manual:
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!
Índice: 111.38 (64 sílabas en 62 palabras en 8 oraciones)
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.
Índice: 65.09 (74 sílabas en 55 palabras en 2 oraciones)
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.
Índice: 3.70 (110 sílabas en 71 palabras en 1 oración)
Si tiene otros pasajes para los cuales ha contado manualmente las sílabas y palabras y ha calculado el índice, puede mostrarlas como verificación.
fuente
Respuestas:
Perl 120 bytes
Muestra de E / S:
El recuento de sílabas se realiza suponiendo que cada grupo de vocales es una sola sílaba, excepto las vocales solitarias al final de una palabra, que solo se cuentan dos tercios del tiempo; Una heurística que parece ser bastante precisa.
fuente
K & R C - 188
196199229caracteresCon la especificación modificada para especificar una función, puedo obtener gran parte de la sobrecarga de la cuenta. También cambio para usar el hack de conteo de sílabas de Strigoides, que es mejor que mi ajuste de fórmula y se extendió para tratar el conteo excesivo de palabras.
Después de encontrar una forma más corta de hacer la detección de vocales, que lamentablemente se basaba en ello
stdchr
, tuve el incentivo de exprimir un poco más de la abominación poco tonta que estaba usando para no tener que ser aburrida.La lógica aquí es una máquina de estado simple. Cuenta las oraciones solo por puntos, las palabras por cadenas de caracteres alfabéticos y las sílabas como cadenas de vocales (incluyendo y).
Tuve que manipular un poco las constantes para que saliera con las cifras correctas, pero he tomado prestado el truco de Strigoides de no contar las sílabas por una fracción fija.
Sin golf , con comentarios y algunas herramientas de depuración:
Salida: (usando el andamio de la versión larga, pero la función de golf).
Deficiencias:
!
o a?
.there
se cuentan como dos y muchas palabras que terminane
se contarán como demasiadas), por lo que he aplicado un factor constante de corrección del 96.9%.[
y{
, lo que claramente no es correcto.Cosas a mirar:
Estoy (momentáneamente) por delante de ambas soluciones de Python aquí, incluso si estoy siguiendo el perl.
Obtenga una carga de lo horrible que hice para detectar las vocales. Tiene sentido si escribe las representaciones ASCII en binario y lee el comentario en la versión larga.
fuente
Python,
202194188184171167 caracteresPrimero, obtenga el número total de palabras dividiéndolas en espacios y líneas nuevas:
Entonces, la fórmula. Los recuentos de oraciones y sílabas solo se usan una vez, por lo que están incrustados en esta expresión.
Las oraciones son simplemente la entrada dividida
.
, con nuevas líneas filtradas:Las sílabas consisten en la entrada dividida a lo largo de no vocales, con espacios eliminados. Esto parece constantemente sobreestimar ligeramente el número de sílabas, por lo que debemos ajustarlo hacia abajo (aproximadamente .98 parece hacerlo):
202 -> 194: en
len(x)-2
lugar delen(x[1:-1])
. Se eliminaron los corchetes innecesarios. Hecho sílaba regex insensible a mayúsculas y minúsculas194 -> 188: el archivo se guardó previamente como dos en lugar de formato de archivo unix, lo
wc -c
que hace que se cuenten nuevas líneas como dos caracteres. Whoops188 -> 184: Deshágase de esos
x for x in ... if x!=...
s desagradables almacenando el resultado intermedio y restandox.count(...)
184 -> 171: Eliminar entrada / salida y convertir a función
171 -> 167: inserte la
len(x)-x.count(...)
s en la fórmulafuente
Python 380 caracteres
Esta es una solución bastante larga, pero funciona lo suficientemente bien, al menos de los 3 casos de prueba siempre que lo haga.
Código de prueba
Resultado -
Usé el contador de sílabas desde aquí - Contando sílabas
Una versión más legible está disponible aquí
fuente
if len(w)>2 and w[-1]=='e'and w[-2]not in v and w[-3]in v:c-= 1
De mente simple pero una buena aproximación. Me gusta.Javascript, 191 bytes
El primer caso de prueba da 112.9 (la respuesta correcta es 111.4, apagada por 1.5 puntos)
El segundo caso de prueba da 67.4 (la respuesta correcta es 65.1, apagada en 2.3 puntos)
El tercer caso de prueba da 1.7 (la respuesta correcta es 3.7, apagada por 2.0 puntos)
fuente