Schreiben Sie ein Programm oder eine Funktion mit zwei Eingaben:
- Eine Text Nachricht
- 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
.
!
?
- 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:
- 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)
- Das erste Zeichen in einem Satz, das anfängliche Leerzeichen ignoriert, muss ein Großbuchstabe sein
- Alle Buchstaben müssen Kleinbuchstaben sein, mit Ausnahme der in der vorherigen Regel angegebenen
- Ein Interpunktionszeichen ist nur nach einem Buchstaben oder Müll zulässig
- Ein Newline-Zeichen ist nur nach einem satzendenden Zeichen zulässig
- Leerzeichen sind am Anfang der Nachricht und nach Leerzeichen nicht zulässig
- 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')