Задача 1. Подсчёт фраз

Задача разбить заданный текст на фразы подсчитать количество раз, которое встречается каждая фраза, вывести фразы, которые встречаются более одного раза (или указанного количества раз) в порядке убывания частоты встречаемости.

Пример

Текст the quick brown fox jumps over the lazy dog разбивается на следующие фразы длины 2: the quick, quick brown, brown fox, fox jumps, jumps over, over the, the lazy, lazy dog. (никакая из этих не повторяется больше одного раза, хотя слово the встречается дважды).

Технические требования

В качестве решения должно быть ркализовано консольное приложение (например, с именем phrases). Формат вывода программы: каждая строка содержит фразу и количество раз, которое она встречается в скобках, например:

hello world (23)
one two (11)

Программа умеет работать с текстом из указанного файла, или со стандартным потоком ввода, если в качестве имени файла указан -. Если имя файла не указано, то программа также работает со стандартным потоком ввода.

$> phrases words.txt
hello world (23)
one two (11)
$> phrases -
n the town where I was born
Lived a man who sailed to sea
And he told us of his life
In the land of submarines
In the (2)

Программа должна поддерживать опциональные (необязательные) аргументы: - -n - длина фразы (в словах) (по-умолчанию 2). - -m - минимальное количество повторов, при котором фразу нужно выводить на экран (по-умолчанию 2).

Пример:

$> phrases -n 3 -m 4 -
we all live in a yellow submarine
yellow submarine yellow submarine
we all live in a yellow submarine
yellow submarine yellow submarine
submarine yellow submarine (4)
yellow submarine yellow (4)

Тестирование

Для ключевого функционала программы необходимо написать юнит-тесты. Рекомендуется использовать одну из библиотек для юнит-тестирования под C++, например Catch (проще в плане использования).

Сборка проекта

Для сборки проекта рекомендуется использовать системы сборки gnu make (на OS Linux), или cmake (кросс-платформенный).

Использование репозитория

Для того, чтобы задача была засчитана как выполненная, код программы должен быть загружен в репозиторий. Репозиторий должен содержать следующее: - Исходный код программы (h и cpp файлы). - Юнит-тесты. - Конфигурационные файлы для сборки проекта (Makefile, CMakeLists ...). - [опционально] краткое описание программы в файле README.md

Крайне не рекомендуется загружать в репозиторий результаты сборки (исполняемые файлы, объектные файлы, временные файлы, созданные в процессе компиляции и т.д.).