计算文本中的拼写错误;尽量减少代码中的拼写错误


28

编写一个需要两个输入的程序或函数:

  1. 一条短信
  2. Github文件中显示的英语词典(包含约60000个单词)

并输出消息中的拼写错误数(有关定义和测试用例,请参见下文)。

您可以将字典作为函数的参数,作为程序期望找到的预定义文件,以代码中的硬编码数据或任何其他明智的方式接收。


您的代码本身应该看起来像一条短信,并且拼写错误最少。因此,您将通过将代码本身作为输入输入来计算代码的分数

获胜者是得分最低的代码(可能的最低得分为0)。如果有多个分数相同的答案,则获胜者取决于代码大小(以字符为单位)。如果仍然有两个答案,则获胜者是较早的一个。


如果需要,可以假定输入消息为ASCII码(字节32 ... 126),其中换行符以常规方式编码(1字节“ 10”或2字节“ 13 10”),并且为非空。但是,如果您的代码包含非ASCII字符,则它也应支持非ASCII输入(以便它可以计算自己的分数)。

字符分为以下几类:

  • 字母 a ... z和A ... Z
  • 空格(此处定义为空格字符或换行符)
  • 标点 . , ; : ! ?
    • 句子结束 . ! ?
  • 垃圾(其余所有)

被定义为字母序列,这是最大的(即,既不,前面和后面通过一字母)。

句子被定义为不属于句结束字符的最大序列。

如果字符违反任何拼写规则,则表示拼写错误

  1. 字母必须属于词典单词(或者换句话说:没有出现在词典中的每个长度为N的单词都算作N个拼写错误)
  2. 句子中的第一个字符(忽略任何开头的空白字符)必须是大写字母
  3. 除上一条规则指定的字母外,所有字母均必须小写
  4. 标点符号只能在字母或乱码之后使用
  5. 换行符只能在句子结尾的字符之后
  6. 消息开头和之后的空格字符不允许使用空格字符
  7. 不应有垃圾(或换句话说:每个垃圾字符计数是一个拼写错误)

另外,最后一句必须为空或仅由一个换行符组成(即,消息应以句子结尾字符和可选的换行符结尾-我们称之为规则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是这里的赢家。
Gurupad Mamadapur

2
格特鲁德更好。命令是任意句子,只有字数和平均字长很重要。
Rainer P.

看到这个,我想到了“ Applescript”。但是,没有Mac。
PurkkaKoodari

1
@PeterTaylor我不希望规则变得过于复杂。您的测试用例很好;我将其添加到我的帖子中。
anatolyg

Answers:


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当前工作目录中名为的文件中。
  • 唯一受启发的部分是线条
    append mistakes, .comb when none words slurp pi given lc word
    其余部分则很糟糕。但是也许它至少可以作为更好解决方案的基线... :)

4
有史以来可读性最强的perl代码
Kritixi Lithos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.