Треки
/
Haskell
Haskell
/
Вправи
/
Підрахунок слів
Підрахунок слів

Підрахунок слів

Середня

Вступ

Ми викладаємо англійську як іноземну учням старших класів.

Ми вирішили побудувати всю навчальну програму на телесеріалах. Потрібно проаналізувати, які слова використовуються і як часто вони повторюються.

Це дозволить обрати найпростіші серіали для початку й поступово підвищувати складність із часом.

Вказівки

Потрібно порахувати, скільки разів кожне слово трапляється в субтитрі драми.

У субтитрах цих драм використовуються лише символи ASCII.

Персонажі часто говорять невимушеною англійською, використовуючи скорочення як-от they're чи it's. Хоча ці скорочення походять від двох слів (наприклад, we are), саме скорочення (we're) вважається одним словом.

Слова можуть розділяти будь-які розділові знаки (наприклад, ":", "!" чи "?") або пробільні символи (наприклад, "\t", "\n" чи " "). Слова не розділяє лише апостроф у скороченнях.

Числа теж вважаються словами. Якщо в субтитрах сказано It costs 100 dollars., то 100 буде окремим словом.

Слова нечутливі до регістру. Наприклад, слово you трапляється тричі в такому реченні:

You come back, you hear me? DO YOU HEAR ME?

Порядок підрахунків слів у результатах не має значення.

Ось приклад, який поєднує кілька описаних вище елементів:

  • прості слова
  • скорочення
  • числа
  • слова, нечутливі до регістру
  • пунктуація (зокрема апострофи) для розділення слів
  • різні види пробільних символів для розділення слів

"That's the password: 'PASSWORD 123'!", cried the Special Agent.\nSo I fled.

Ось відображення для цього субтитру:

123: 1
agent: 1
cried: 1
fled: 1
i: 1
password: 2
so: 1
special: 1
that's: 1
the: 2

Підказки

Щоб виконати цю вправу, потрібно реалізувати функцію wordCount, яка приймає текст і повертає, скільки разів зустрічається кожне слово.

Якщо цю вправу розвʼязувати вперше, радимо дотримуватися наведеної сигнатури:

wordCount :: String -> [(String, Int)]

Пізніше варто повернутися до цієї задачі та поекспериментувати з іншими типами даних і бібліотеками:

  • Text з пакета text.
  • Map з пакета containers.
  • MultiSet з пакета multiset

Набір тестів навмисно створено так, щоб приймати майже будь-яку сигнатуру типу, яка має сенс, тож радимо пошукати той варіант, який видається найкращим.


Джерело

Це класична навчальна задача, але ми згадали про неї, побачивши її в Go Tour.
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Haskell Exercism

Час розпочати Підрахунок слів?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Haskell, а також 107 вправ та справжнє наставництво від людей, і все це безкоштовно.