Подсчет орфографических ошибок в тексте; минимизировать количество орфографических ошибок в вашем коде

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')
anatolyg
источник
2
Я ожидал кучу лазеек, но вы, казалось, покрыли их все. +1 от меня.
Натан Меррилл
4
Я думаю, что SPL победитель здесь.
Гурупад Мамадапур
2
Гертруда еще лучше. Команды - это произвольные предложения, значение имеют только количество слов и средняя длина слова.
Райнер П.
Я подумал «Яблоко», когда увидел это. Но у меня нет 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в текущем рабочем каталоге.
  • Единственная вдохновляющая часть - это линия
    append mistakes, .comb when none words slurp pi given lc word,
    остальное довольно плохо. Но, возможно, это может послужить основой для лучших решений ... :)
SMLS
источник
4
Самый читаемый Perl-код за всю историю
Kritixi Lithos