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


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 тут є переможцем.
Гурупад Мамадапур

2
.Гертруда ще краще. Команди - це довільні пропозиції, значення мають лише кількість слів і середня довжина слова.
Райнер П.

Я подумав "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у поточній робочій директорії.
  • Єдина натхненна частина - лінія
    append mistakes, .comb when none words slurp pi given lc word,
    решта досить погана. Але, можливо, це може принаймні послужити базовою лінією для кращих рішень ... :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.