Сообщество Engee

Слова ABC

Автор
avatar-maximsidorovmaximsidorov
Notebook

Алгоритм поиска ABC-слов

Этот код реализует алгоритм, который находит в файле слова, содержащие буквы «a», «b» и «c» именно в таком порядке (не обязательно подряд).

Введение

В данном примере мы рассматриваем задачу поиска специальных слов, называемых ABC-словами. Это такие слова, в которых буквы a, b и c встречаются в указанном порядке, но не обязательно друг за другом. Например, слово "abacus" — ABC-слово, потому что буквы a, b и c находятся в нужном порядке. А слово "cab" — не является ABC-словом, так как порядок нарушен.

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

Суть алгоритма — проверить для каждого слова, существуют ли буквы 'a', 'b' и 'c' в нем, и расположены ли их позиции в слове в неубывающем порядке.

Основная часть

Функция isabcword служит для определения, является ли слово ABC-словом

Вход: слово w, второй параметр _ игнорируется

In [ ]:
function isabcword(w, _)
    # Создаем список позиций букв 'a', 'b', 'c' в слове, если они есть
    # Если буква не найдена, findfirst вернет nothing
    positions = [findfirst(c -> c == ch, w) for ch in "abc"]

    # Проверяем, все ли из трех букв найдены (никто не равен nothing)
    # И проверяем, что позиции этих букв расположены в порядке возрастания
    return all(!isnothing, positions) && issorted(positions) ? w : ""
end
Out[0]:
isabcword (generic function with 1 method)

Объяснение функции isabcword

Представим слово "abacus". Буквы находятся в таких позициях:

  • a — первая (позиция 1)
  • b — вторая (позиция 2)
  • c — третья (позиция 3)

Список [1, 2, 3] удовлетворяет условию issorted, так как числа идут по возрастанию.

Но если бы было слово "cabbage":

  • a на 3-й позиции,
  • b на 4-й,
  • c на 1-й,

то список был бы [1, 3, 4], но позиции не отсортированы (1 < 3 < 4 — всё верно). Важно, чтобы буквы шли именно в нужном порядке.

Функция возвращает либо само слово (если оно ABC-слово), либо пустую строку, если нет.

Использование функции

Функция foreachword открывает файл и применяет к каждому слову переданную функцию.

Она похожа на map или foreach, но адаптирована для работы с файлами со списком слов.

In [ ]:
function foreachword(filename, func)
    open(filename) do file
        for line in eachline(file)
            word = strip(line)  # убираем пробелы
            result = func(word, nothing)
            if !isempty(result)
                println(result)
            end
        end
    end
end
Out[0]:
foreachword (generic function with 1 method)

Вызываем нашу функцию для файла "unixdict.txt"

In [ ]:
foreachword("unixdict.txt", isabcword)
aback
abacus
abc
abdicate
abduct
abeyance
abject
abreact
abscess
abscissa
abscissae
absence
abstract
abstracter
abstractor
adiabatic
aerobacter
aerobic
albacore
alberich
albrecht
algebraic
alphabetic
ambiance
ambuscade
aminobenzoic
anaerobic
arabic
athabascan
auerbach
diabetic
diabolic
drawback
fabric
fabricate
flashback
halfback
iambic
lampblack
leatherback
metabolic
nabisco
paperback
parabolic
playback
prefabricate
quarterback
razorback
roadblock
sabbatical
snapback
strabismic
syllabic
tabernacle
tablecloth

Какие слова будут напечатаны? Только те, для которых isabcword вернет непустую строку, т.е. те, которые соответствуют нашему определению ABC-слова.

Заключение

Мы рассмотрели пример простой, но полезной программы на языке Julia, решающей задачу поиска ABC-слов. Алгоритм использует базовые функции работы со строками и коллекциями (findfirst, all, issorted) и позволяет эффективно фильтровать слова на основе определенного условия.

Этот пример демонстрирует гибкость и выразительность Julia для решения задач обработки текстовых данных без привлечения сложных библиотек. Он также может быть удобной отправной точкой для более сложных языковых экспериментов.

Пример разработан с использованием материалов Rosetta Code