2つの入力を取るプログラムまたは関数を作成します。
- テキストメッセージ
- この Githubファイルに表示される英語の辞書(約60000語を含む)
メッセージのスペルエラーの数を出力します(定義とテストケースについては以下を参照)。
辞書は、関数へのパラメーターとして、プログラムが検出することを予期する事前定義ファイルとして、コード内のハードコーディングされたデータとして、またはその他の適切な方法で受け取ることができます。
コード自体はテキストメッセージのように見えるはずで、スペルミスは最小限です。そのため、コードを入力としてコード自体に渡すことで、コードのスコアを計算します。
勝者は、スコアが最も低いコードです(可能な最小スコアは0です)。同じスコアの回答が複数ある場合、勝者はコードサイズ(文字数)によって決定されます。それでも2つの答えが結びついている場合、勝者は早い方です。
必要に応じて、入力メッセージはASCII(バイト32 ... 126)であり、改行は従来の方法(1バイト "10"または2バイト "13 10")でエンコードされ、空ではないと想定できます。ただし、コードに非ASCII文字が含まれている場合は、非ASCII入力もサポートする必要があります(したがって、独自のスコアを計算できます)。
キャラクターは次のクラスに分類されます。
- 文字 a ... zおよびA ... Z
- 空白(ここではスペース文字または改行文字として定義されます)
- 句読点
.
,
;
:
!
?
- 文末
.
!
?
- 文末
- ごみ(その他すべて)
言葉は(つまり、どちらも先行していないにも文字が続く)最大となる文字の配列として定義されます。
文は文末でない文字の最大の配列として定義されます。
文字は、次のいずれかのスペル規則に違反している場合、スペルエラーです。
- 文字は辞書の単語に属している必要があります(または、言い換えると、辞書に表示されていない長さNの各単語はN個のスペルミスとしてカウントされます)
- 最初の空白文字を無視する文の最初の文字は大文字でなければなりません
- 前のルールで指定された文字を除き、すべての文字は小文字でなければなりません
- 句読点は、文字またはゴミの後にのみ使用できます
- 改行文字は、文末文字の後にのみ許可されます
- 空白文字は、メッセージの先頭および空白文字の後には使用できません
- ガベージはありません(つまり、各ガベージ文字のカウントはスペルミスです)
さらに、最後の文は空にするか、改行文字1つだけで構成する必要があります(つまり、メッセージは文末文字とオプションの改行で終了する必要があります-ルール8と呼びましょう)。
テストケース(各文字の下に違反するルールがあります。=>
必要な答えは後です):
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')