テキストのスペルミスを数えます。コード内のスペルミスの数を最小限に抑える


28

2つの入力を取るプログラムまたは関数を作成します。

  1. テキストメッセージ
  2. この Githubファイルに表示される英語の辞書(約60000語を含む)

メッセージのスペルエラーの数を出力します(定義とテストケースについては以下を参照)。

辞書は、関数へのパラメーターとして、プログラムが検出することを予期する事前定義ファイルとして、コード内のハードコーディングされたデータとして、またはその他の適切な方法で受け取ることができます。


コード自体はテキストメッセージのように見えるはずで、スペルミスは最小限です。そのため、コードを入力としてコード自体に渡すことで、コードのスコアを計算します。

勝者は、スコアが最も低いコードです(可能な最小スコアは0です)。同じスコアの回答が複数ある場合、勝者はコードサイズ(文字数)によって決定されます。それでも2つの答えが結びついている場合、勝者は早い方です。


必要に応じて、入力メッセージはASCII(バイト32 ... 126)であり、改行は従来の方法(1バイト "10"または2バイト "13 10")でエンコードされ、空ではないと想定できます。ただし、コードに非ASCII文字が含まれている場合は、非ASCII入力もサポートする必要があります(したがって、独自のスコアを計算できます)。

キャラクターは次のクラスに分類されます。

  • 文字 a ... zおよびA ... Z
  • 空白(ここではスペース文字または改行文字として定義されます)
  • 句読点 . , ; : ! ?
    • 文末 . ! ?
  • ごみ(その他すべて)

言葉は(つまり、どちらも先行していないにも文字が続く)最大となる文字の配列として定義されます。

文は文末でない文字の最大の配列として定義されます。

文字は、次のいずれかのスペル規則に違反している場合、スペルエラーです。

  1. 文字は辞書の単語に属している必要があります(または、言い換えると、辞書に表示されていない長さNの各単語はN個のスペルミスとしてカウントされます)
  2. 最初の空白文字を無視する文の最初の文字は大文字でなければなりません
  3. 前のルールで指定された文字を除き、すべての文字は小文字でなければなりません
  4. 句読点は、文字またはゴミの後にのみ使用できます
  5. 改行文字は、文末文字の後にのみ許可されます
  6. 空白文字は、メッセージの先頭および空白文字の後には使用できません
  7. ガベージはありません(つまり、各ガベージ文字のカウントはスペルミスです)

さらに、最後の文は空にするか、改行文字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')

2
私は抜け穴の束を期待していましたが、あなたはそれらをすべてカバーしているように見えました。私から+1。
ネイサンメリル

4
ここではSPLが勝者だと思います。
グルパッドママダプール

2
.Gertrudeはさらに優れています。コマンドは任意の文であり、単語数と平均単語長のみが重要です。
ライナー

これを見たとき、「Applescript」と思った。ただし、Macはありません。
PurkkaKoodari

1
@PeterTaylorルールが複雑になりたくない。テストケースは問題ありません。投稿に追加しました。
アナトリグ

回答:


6

Perl 6、134のスペルミス

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

読みやすくするために余分な空白を追加:

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

ノート:

  • 3.14159265358979現在の作業ディレクトリで呼び出されるファイルに辞書が必要です。
  • 唯一の影響を受けた部分はline
    append mistakes, .comb when none words slurp pi given lc word
    、残りはかなり悪いです。しかし、それは少なくともより良いソリューションのベースラインとして役立つかもしれません... :)

4
これまでで最も読みやすいperlコード
Kritixi Lithos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.