Conta errori di ortografia nel testo; minimizzare il numero di errori di ortografia nel codice


28

Scrivi un programma o una funzione che accetta due input:

  1. Un messaggio di testo
  2. Il dizionario della lingua inglese, come appare in questo file Github (contenente circa 60000 parole)

e genera il numero di errori di ortografia nel messaggio (vedi sotto per la definizione e i casi di test).

Puoi ricevere il dizionario come parametro per la tua funzione, come file predefinito che il tuo programma si aspetta di trovare, come dati hardcoded nel tuo codice, o in qualsiasi altro modo ragionevole.


Il tuo stesso codice dovrebbe apparire come un messaggio di testo, con un numero minimo di errori di ortografia. Quindi, calcolerai il punteggio del tuo codice alimentandolo a se stesso come input.

Il vincitore è il codice che ha il punteggio più basso (il punteggio minimo possibile è 0). Se ci sono più risposte con lo stesso punteggio, il vincitore viene deciso dalla dimensione del codice (in caratteri). Se due risposte sono ancora in parità, il vincitore è il primo.


Se necessario, si può presumere che il messaggio di input sia ASCII (byte 32 ... 126) con le nuove righe codificate in modo convenzionale (1 byte "10" o 2 byte "13 10") e non vuoto. Tuttavia, se il tuo codice ha caratteri non ASCII, dovrebbe supportare anche input non ASCII (in modo da poter calcolare il proprio punteggio).

I personaggi sono suddivisi nelle seguenti classi:

  • Lettere a ... z e A ... Z
  • Spazio bianco (definito qui come il carattere spazio o il carattere di nuova riga)
  • Punteggiatura . , ; : ! ?
    • Frase fine . ! ?
  • Immondizia (tutto il resto)

Una parola è definita come una sequenza di lettere, che è massima (cioè né preceduta né seguita da una lettera).

Una frase è definita come una sequenza massima di caratteri che non terminano la frase.

Un personaggio è un errore di ortografia se viola una delle regole di ortografia:

  1. Una lettera deve appartenere a una parola del dizionario (o, in altre parole: ogni parola di lunghezza N che non appare nel dizionario conta come N errori di ortografia)
  2. Il primo carattere di una frase, ignorando qualsiasi carattere iniziale di spazio bianco, deve essere una lettera maiuscola
  3. Tutte le lettere devono essere minuscole, tranne quelle specificate dalla regola precedente
  4. Un carattere di punteggiatura è consentito solo dopo una lettera o immondizia
  5. Un carattere di nuova riga è consentito solo dopo un carattere che termina la frase
  6. I caratteri di spazi bianchi non sono consentiti all'inizio del messaggio e dopo i caratteri di spazi bianchi
  7. Non dovrebbe esserci immondizia (o, in altre parole: ogni carattere di immondizia conta è un errore di ortografia)

Inoltre, l'ultima frase deve essere vuota o consistere esattamente di un carattere di nuova riga (cioè il messaggio dovrebbe terminare con un carattere di fine frase e una nuova riga opzionale - chiamiamola regola 8).

Casi di prova (sotto ogni personaggio c'è una regola che viola; dopo =>è la risposta richiesta):

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')

2
Mi aspettavo un mucchio di scappatoie, ma sembra che tu le abbia coperte tutte. +1 da me.
Nathan Merrill,

4
Penso che SPL sia il vincitore qui.
Gurupad Mamadapur,

2
Gertrude è ancora meglio. I comandi sono frasi arbitrarie, contano solo il conteggio delle parole e la lunghezza media delle parole.
Rainer P.

Ho pensato "Applescript" quando ho visto questo. Non ho un Mac, però.
PurkkaKoodari,

1
@PeterTaylor Non voglio che le regole diventino troppo complicate. Il tuo test case va bene; L'ho aggiunto al mio post.
Anatolyg

Risposte:


6

Perl 6 , 134 errori di 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

Con spazi bianchi extra per la leggibilità:

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

Gli appunti:

  • Si aspetta il dizionario in un file chiamato 3.14159265358979nella directory di lavoro corrente.
  • L'unica parte ispirata è la linea
    append mistakes, .comb when none words slurp pi given lc word,
    il resto è piuttosto male. Ma forse può almeno servire da base per soluzioni migliori ... :)

4
Il codice perl più leggibile di sempre
Kritixi Lithos il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.