Rechtschreibfehler im Text zählen; Minimieren Sie die Anzahl der Rechtschreibfehler in Ihrem Code

28

Schreiben Sie ein Programm oder eine Funktion mit zwei Eingaben:

  1. Eine Text Nachricht
  2. Das Wörterbuch der englischen Sprache, wie es in dieser Github-Datei vorkommt (enthält ca. 60000 Wörter)

und gibt die Anzahl der Rechtschreibfehler in der Nachricht aus (Definition und Testfälle siehe unten).

Sie können das Wörterbuch als Parameter für Ihre Funktion, als vordefinierte Datei, die Ihr Programm erwartet, als fest codierte Daten in Ihrem Code oder auf andere sinnvolle Weise erhalten.


Ihr Code sollte selbst wie eine Textnachricht mit einer minimalen Anzahl von Rechtschreibfehlern aussehen. Sie berechnen also die Punktzahl Ihres Codes, indem Sie ihn als Eingabe an sich selbst weitergeben.

Der Gewinner ist der Code mit der niedrigsten Punktzahl (die minimal mögliche Punktzahl ist 0). Wenn es mehrere Antworten mit derselben Punktzahl gibt, wird der Gewinner anhand der Codegröße (in Zeichen) bestimmt. Wenn immer noch zwei Antworten gleich sind, ist der Gewinner die frühere.


Bei Bedarf können Sie davon ausgehen, dass die Eingangsnachricht ASCII (Bytes 32 ... 126) ist, wobei die Zeilenumbrüche auf herkömmliche Weise codiert sind (1 Byte "10" oder 2 Bytes "13 10") und nicht leer sind. Wenn Ihr Code jedoch Nicht-ASCII-Zeichen enthält, sollte er auch Nicht-ASCII-Eingaben unterstützen (damit er seine eigene Punktzahl berechnen kann).

Zeichen werden in folgende Klassen unterteilt:

  • Buchstaben a ... z und A ... Z
  • Leerzeichen (hier entweder als Leerzeichen oder als Zeilenvorschub definiert)
  • Interpunktion . , ; : ! ?
    • Satzende . ! ?
  • Müll (alles andere)

Ein Wort ist definiert als eine Folge von Buchstaben, die maximal ist (dh weder vor noch nach einem Buchstaben steht).

Ein Satz ist definiert als eine maximale Folge von Zeichen, die nicht satzend sind.

Ein Zeichen ist ein Rechtschreibfehler, wenn es gegen eine der folgenden Rechtschreibregeln verstößt:

  1. Ein Buchstabe muss zu einem Wörterbuchwort gehören (oder mit anderen Worten: Jedes Wort der Länge N, das nicht im Wörterbuch erscheint, zählt als N Rechtschreibfehler)
  2. Das erste Zeichen in einem Satz, das anfängliche Leerzeichen ignoriert, muss ein Großbuchstabe sein
  3. Alle Buchstaben müssen Kleinbuchstaben sein, mit Ausnahme der in der vorherigen Regel angegebenen
  4. Ein Interpunktionszeichen ist nur nach einem Buchstaben oder Müll zulässig
  5. Ein Newline-Zeichen ist nur nach einem satzendenden Zeichen zulässig
  6. Leerzeichen sind am Anfang der Nachricht und nach Leerzeichen nicht zulässig
  7. Es sollte keinen Müll geben (oder mit anderen Worten: Jede Müllzeichenanzahl ist ein Rechtschreibfehler)

Außerdem muss der letzte Satz entweder leer sein oder aus genau einem Zeilenumbruchzeichen bestehen (dh die Nachricht sollte mit einem Zeilenendezeichen und einem optionalen Zeilenumbruch enden - nennen wir es Regel 8).

Testfälle (unter jedem Zeichen steht eine Regel, gegen die es verstößt; danach =>folgt die erforderliche Antwort):

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
quelle
2
Ich hatte ein paar Schlupflöcher erwartet, aber Sie schienen sie alle zu überdecken. +1 von mir.
Nathan Merrill
4
Ich denke, SPL ist hier der Gewinner.
Gurupad Mamadapur
2
.Gertrude ist noch besser. Befehle sind willkürliche Sätze, nur die Wortanzahl und die durchschnittliche Wortlänge spielen eine Rolle.
Rainer P.
Ich dachte "Applescript", als ich das sah. Habe aber keinen Mac.
PurkkaKoodari
1
@PeterTaylor Ich möchte nicht, dass die Regeln zu kompliziert werden. Ihr Testfall ist in Ordnung; Ich habe es zu meinem Beitrag hinzugefügt.
Anatolyg

Antworten:

6

Perl 6 , 134 Rechtschreibfehler

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

Mit zusätzlichen Leerzeichen für die Lesbarkeit:

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

Anmerkungen:

  • Erwartet das Wörterbuch in einer Datei, die 3.14159265358979im aktuellen Arbeitsverzeichnis aufgerufen wird .
  • Der einzige inspirierende Teil ist die Linie
    append mistakes, .comb when none words slurp pi given lc word,
    der Rest ist ziemlich schlecht. Aber vielleicht kann es zumindest als Grundlage für bessere Lösungen dienen ... :)
smls
quelle
4
Der
lesbarste