Поиск анаграмм по словарю

Что-ж, настало время законченых примеров на lua! Попробуем разобрать программу, которая ищет анаграммы по словарю!

На написание данной программы меня вдоховила эта статья: https://tproger.ru/problems/verify-anagrams/. Нам понадобится либа luautf8. Сделаем так: я покажу сначала весь код, потом разберём его. Ок?

Если вы не поняли ничего, то это не страшно — сейчас всё разберём!
Поехали!

Этот кусок кода составляет таблицу для сортировки символов (тут, как видите, русский алфавит, для каждого языка будем менять и строку).
После этого, langtab = {'а', 'б', 'в', ...} .

Тут и так всё предельно понятно.

Здесь мы превращаем строку в таблицу, сортируем (по langtab ), сцепляем назад.

Эта функция препарирует анаграммы до равенства — удаляет небуквы, переводит в нижний регистр, потом сортирует.

Кажется сложной из-за обработки ошибок. На самом деле, она просто дёргает колбэк для каждой строки.
Закомментирован код для передачи номера строки в файле — в этом примере он не нужен.

Далее, иницализируется таблица result , куда сохраняются упорядоченные данные.
После этого, функции для работы с ней: addentry , removealone  и printresult .

Препарирует слово, проверяет наличие анаграммы к нему в таблице, добавляет поле, если есть, создаёт новую запись, если нет.

Эта функция удаляет слова без анаграмм (т. е., где к препарированому слову только одно соответствие). Разбито на два цикла из-за багов при удалении тек. элемента в pairs .

Печатает результаты в виде

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

Уфффф… Да, ещё: вот вам архивчик с кодом и примером словаря. Можете попробовать поискать анаграммы!

Пока!

P. S. пароним и пироман — шедевр!

Добавить комментарий