Contar errores de ortografía en el texto; minimizar la cantidad de errores ortográficos en su código

28

Escriba un programa o función que tome dos entradas:

  1. Un mensaje de texto
  2. El diccionario del idioma inglés, tal como aparece en este archivo Github (que contiene aproximadamente 60000 palabras)

y genera el número de errores ortográficos en el mensaje (consulte a continuación la definición y los casos de prueba).

Puede recibir el diccionario como un parámetro para su función, como un archivo predefinido que su programa espera encontrar, como datos codificados en su código o de cualquier otra manera sensata.


Su código debería verse como un mensaje de texto, con un número mínimo de errores ortográficos. Por lo tanto, calculará la puntuación de su código al alimentarlo como entrada.

El ganador es el código que tiene la puntuación más baja (la puntuación mínima posible es 0). Si hay varias respuestas con la misma puntuación, el ganador se decide por el tamaño del código (en caracteres). Si todavía hay dos respuestas empatadas, el ganador es el primero.


Si es necesario, puede suponer que el mensaje de entrada es ASCII (bytes 32 ... 126) con líneas nuevas codificadas de manera convencional (1 byte "10" o 2 bytes "13 10") y no vacío. Sin embargo, si su código tiene caracteres no ASCII, también debe admitir entradas no ASCII (para que pueda calcular su propia puntuación).

Los personajes se subdividen en las siguientes clases:

  • Letras a ... z y A ... Z
  • Espacio en blanco (definido aquí como el carácter de espacio o el carácter de nueva línea)
  • Puntuación . , ; : ! ?
    • Final de oración . ! ?
  • Basura (todo lo demás)

Una palabra se define como una secuencia de letras, que es máxima (es decir, ni precedida ni seguida de una letra).

Una oración se define como una secuencia máxima de caracteres que no terminan la oración.

Un carácter es un error ortográfico si viola alguna de las reglas ortográficas:

  1. Una letra debe pertenecer a una palabra del diccionario (o, en otras palabras: cada palabra de longitud N que no aparece en el diccionario cuenta como N errores ortográficos)
  2. El primer carácter de una oración, que ignora los caracteres de espacio en blanco iniciales, debe ser una letra mayúscula
  3. Todas las letras deben estar en minúsculas, excepto las especificadas por la regla anterior.
  4. Un carácter de puntuación solo se permite después de una letra o basura
  5. Un carácter de nueva línea solo se permite después de un carácter que termina la oración
  6. Los caracteres de espacio en blanco no están permitidos al comienzo del mensaje y después de los caracteres de espacio en blanco
  7. No debería haber basura (o, en otras palabras: cada carácter de basura cuenta es un error ortográfico)

Además, la última oración debe estar vacía o consistir exactamente en un carácter de nueva línea (es decir, el mensaje debe terminar con un carácter de finalización de oración y una nueva línea opcional; llamémosla regla 8).

Casos de prueba (debajo de cada carácter hay una regla que infringe; después =>está la respuesta requerida):

Here is my 1st test case!!
           711           4                => 4

main(){puts("Hello World!");}
2   777    883     3     77 78            => 12

  This message starts with two spaces
66                                   8    => 3

What ? No apostrophe's??
     4              71 4                  => 4

  Extra   whitespace   is   BAD!
66      661111111111 66   66333           => 21

Several
lines?
Must be used only to separate sentences.
                                          => 1 (first linebreak is en error: rule 5)

"Come here," he said.
73         7                              => 3 (sentence starts with '"', not 'C')
anatolyg
fuente
2
Esperaba un montón de lagunas, pero parece que las cubriste todas. +1 de mi parte
Nathan Merrill
44
Creo que SPL es el ganador aquí.
Gurupad Mamadapur
2
.Gertrude es aún mejor. Los comandos son oraciones arbitrarias, solo cuentan el recuento de palabras y la longitud promedio de las palabras.
Rainer P.
Pensé "Applescript" cuando vi esto. Sin embargo, no tengo una Mac.
PurkkaKoodari
1
@ PeterTaylor No quiero que las reglas se vuelvan demasiado complicadas. Tu caso de prueba está bien; Lo agregué a mi publicación.
anatolyg

Respuestas:

6

Perl 6 , 134 errores de ortografía

my token punctuation {<[.,;:!?]>}
my \text = slurp; my \mistakes=[]; for split /\.|\!|\?/, text { for .trim.match: :g, /<:letter>+/ -> \word { (append mistakes, .comb when none words slurp pi given lc word) or (push mistakes, $_ if ((.from or word.from) xor m/<[a..z]>/) for word.match: :g, /./) }}
append mistakes, comb / <after \s | <punctuation>> <punctuation> | <!before <punctuation> | <:letter> | \s> . | <!after \.|\!|\?> \n | [<before ^> | <after \s>] \s /, text; say mistakes.Numeric

Con espacios en blanco adicionales para facilitar la lectura:

my token punctuation {<[.,;:!?]>}
my \text = slurp;
my \mistakes=[];
for split /\.|\!|\?/, text {
    for .trim.match: :g, /<:letter>+/ -> \word {
        (append mistakes, .comb when none words slurp pi given lc word)
        or
        (push mistakes, $_ if ((.from or word.from) xor m/<[a..z]>/) for word.match: :g, /./)
    }
}
append mistakes, comb /
  <after \s | <punctuation>> <punctuation>
  | <!before <punctuation> | <:letter> | \s> .
  | <!after \.|\!|\?> \n
  | [<before ^> | <after \s>] \s
/, text;
say mistakes.Numeric

Notas:

  • Espera el diccionario en un archivo llamado 3.14159265358979en el directorio de trabajo actual.
  • La única parte inspirada es la línea
    append mistakes, .comb when none words slurp pi given lc word,
    el resto es bastante malo. Pero tal vez al menos pueda servir como línea de base para mejores soluciones ... :)
smls
fuente
44
El código perl más legible de la historia
Kritixi Lithos