Contar erros de ortografia no texto; minimizar o número de erros de ortografia no seu código

28

Escreva um programa ou função que aceite duas entradas:

  1. Uma mensagem de texto
  2. O dicionário do idioma inglês, como aparece neste arquivo do Github (contendo cerca de 60000 palavras)

e gera o número de erros de ortografia na mensagem (veja abaixo para definição e casos de teste).

Você pode receber o dicionário como um parâmetro para sua função, como um arquivo predefinido que seu programa espera encontrar, como dados codificados no seu código ou de qualquer outra maneira sensata.


Seu código deve parecer uma mensagem de texto, com um número mínimo de erros de ortografia. Portanto, você calculará a pontuação do seu código, alimentando-o como entrada.

O vencedor é o código que tem a menor pontuação (a pontuação mínima possível é 0). Se houver várias respostas com a mesma pontuação, o vencedor será decidido pelo tamanho do código (em caracteres). Se duas respostas ainda estiverem empatadas, o vencedor será o anterior.


Se necessário, você pode assumir que a mensagem de entrada seja ASCII (bytes 32 ... 126) com novas linhas codificadas de maneira convencional (1 byte "10" ou 2 bytes "13 10") e não vazio. No entanto, se o seu código tiver caracteres não ASCII, ele também deverá suportar entrada não ASCII (para que possa calcular sua própria pontuação).

Os caracteres são subdivididos nas seguintes classes:

  • Letras a ... z e A ... Z
  • Espaço em branco (definido aqui como o caractere de espaço ou o caractere de nova linha)
  • Pontuação . , ; : ! ?
    • Final de frase . ! ?
  • Lixo (todo o resto)

Uma palavra é definida como uma sequência de letras, que é máxima (ou seja, nem precedida nem seguida por uma letra).

Uma frase é definida como uma sequência máxima de caracteres que não termina a frase.

Um caractere é um erro de ortografia se violar alguma das regras de ortografia:

  1. Uma letra deve pertencer a uma palavra do dicionário (ou, em outras palavras: cada palavra de comprimento N que não aparece no dicionário conta como N erros de ortografia)
  2. O primeiro caractere de uma frase, ignorando qualquer caractere inicial de espaço em branco, deve ser uma letra maiúscula
  3. Todas as letras devem estar em minúsculas, exceto as especificadas na regra anterior
  4. Um caractere de pontuação é permitido somente após uma carta ou lixo
  5. Um caractere de nova linha só é permitido após um caractere de finalização de frase
  6. Caracteres de espaço em branco não são permitidos no início da mensagem e após caracteres de espaço em branco
  7. Não deve haver lixo (ou, em outras palavras: cada caractere de lixo conta é um erro de ortografia)

Além disso, a última frase deve estar vazia ou consistir em exatamente um caractere de nova linha (ou seja, a mensagem deve terminar com um caractere de finalização de frase e uma nova linha opcional - vamos chamá-la de regra 8).

Casos de teste (abaixo de cada caractere há uma regra que ele viola; depois =>é a resposta necessária):

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
fonte
2
Eu estava esperando um monte de brechas, mas você parecia cobrir todas elas. +1 de mim.
Nathan Merrill
4
Eu acho que o SPL é o vencedor aqui.
Gurupad Mamadapur
2
. Gertrude é ainda melhor. Comandos são sentenças arbitrárias, apenas a contagem de palavras e o tamanho médio das palavras são importantes.
Rainer P.
Eu pensei "Applescript" quando vi isso. Não tenha um Mac, no entanto.
precisa saber é o seguinte
1
@ PeterTaylor Não quero que as regras se tornem muito complicadas. Seu caso de teste está bom; Eu adicionei ao meu post.
precisa saber é

Respostas:

6

Perl 6 , 134 erros de ortografia

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

Com espaço em branco extra para facilitar a leitura:

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 o dicionário em um arquivo chamado 3.14159265358979no diretório de trabalho atual.
  • A única parte inspirada é a linha
    append mistakes, .comb when none words slurp pi given lc word,
    o resto é muito ruim. Mas talvez possa pelo menos servir como base para melhores soluções ... :)
smls
fonte
4
O código mais legível perl sempre
Kritixi Lithos