Комбинаторный поэт

Олег Марьин
https://sites.google.com/site/mnogoanagramm/home/7-fajly

Первая бета-версия программы Комбинаторный Поэт. В отличие от предыдущих моих
'анаграммных' программ эта программа диалоговая, с нормальным Windows интерфейсом.

Общее описание.

Программа Комбинаторный Поэт облегчает создание произведений так называемой комбинаторной
поэзии, к которым обычно относят тавтограммы, анаграммы, палиндромы, разнобуквицы и др.
Также может быть использована  при решении словесных задач и упражнений, таких как, метаграммы и др.

Для этого в ней реализован ряд полезных функций:

  -  поиск слов в словаре по регулярным выражениям
  -  генерациия анаграмм в различных режимах: генерация анаграммного спектра слов и выражений,
           генерация анаграмм с помощью поиска дополнений
  -  генерация вариантов разнобуквиц, с помощью решения задачи целочисленного
           линейного программирования (ЦЛП) с использованием стандартного пакета
           линейного программирования LP_SOLVE
  -  генерация цепочек метаграмм
  -  проверка текстов на палиндромность
  -  разложение палиндромов на неразложимые элементарные палиндромы

В дальнейшем предполагается дополнить программу алгоритмами диалогового создания палиндромов,
базой данных палиндромов, и другими подсистемами.


Поиск слов в словаре.

Программа позволяет производить поиск слов по самым изощрённым критериям, которые можно
задавать с помощью аппарата так называемых регулярных  выражений. Например, если в
качестве строки поиска будет задано такое выражение 'про' (без кавычек), то будут найдены
все слова, содержащие подстроку “про”. А вот если критерий немного поменять и задать как
'^про'  (без каычек), то будут найдены все слова, содержащие строку “про” в начале слова.
А вот такое выражение '^[ап]' будет искать слова, первая буква которых ‘а’ или ‘п’.
Аналогичные варианты для поиска в конце слова

про$
[ап]$

Если нужно найти слово, начинающееся на букву Б и заканчивающееся на букву Я, то используйте выражение ^б.*я$
То есть
символ ^ означает начало слова,
символ $ - конец слова,
последовательность .* - любые несколько букв.
Если символы задаются в квадратных скобках, то критерию поиска на данном месте удовлетворяет
любой из них. Если не хватает примеров, приведенных в руководстве, то можно использовать
любое руководство по Регулярным выражениям. Для поиска слов используйте пункт меню Поиск
слов и его подпункты Задать критерий поиска, Результаты предыдущих поисков и другие
подпункты.

Генерация анаграмм.

Анаграмма представляет собой комбинацию слов, состоящую из двух частей. Первая часть –
произвольный набор слов, вторая часть – набор слов, состоящий из тех же букв, что и
первая часть. Иногда допускаются послабления: замена ‘ё’   на ‘е’, ‘й’ на ‘и’ пропуск
твердого и мягкого знаков.  Обычно первую и вторую части анаграммы записывают одна под
другой. Например,

треугольник
не округлить

Генерация анаграмм может осуществляться в двух режимах. В первом режиме задаётся начальная
(первая) часть анаграммы полностью и ищется вторая часть. Во втором режиме задаются
фрагменты первой и второй части (или только одной из них), и ищутся недостающие слова,
как для первой, так и для второй части, которые сделают получившийся текст полной
анаграммой. Ищутся ровно два слова, по одному на первую и вторую части анаграммы.
Первый режим называется ‘поиском анаграммного спектра слова или выражения’.

Для начала генерации анаграммного спектра нужно выбрать пункт меню Анаграммы и затем
Генерация анаграммного спектра. Откроется форма ввода, где нужно ввести первую,
начальную часть анаграммы. Можно ввести несколько строк – для каждой строки будет
искаться отдельный набор анаграмм. В каждой строке можно ввести одно или несколько
слов, разделённых пробелами. Общая длина слов не должна превышать 15 букв.
Иначе процесс поиска может затянуться, а результат будет необозримым.
Программа ищет конечную часть анаграммы, состоящую максимум из 4 слов.
То есть, анаграммы из одного слова, двух слов, трёх слов и четырёх слов.

Строки будут обрабатываться последовательно, одна за другой. Для начала поиска анаграмм
нужно кликнуть на кнопке Найти анаграммы. При  этом откроется окно Монитора активности
заданий, а также окно, в котором будет запущен отдельный процесс поиска анаграмм. Этот
процесс запускается в минимизированном виде и виден обычно как иконка внизу оконной
системы Windows (где обычно помещаются иконки запущенных заданий Windows).

Вы можете его открыть и увидите в чёрном (DOS) окне сообщения, которые выдаёт программа
в процессе поиска анаграмм. Можно запускать несколько процессов один за другим. В Мониторе
активности заданий каждый такой процесс отражается отдельной строкой. Когда строка,
отражающая активность процесса поиска исчезнет из окна монитора, и, соответственно,
закроется DOS окно  процесса построения анаграммы, можно посмотреть результаты поиска
анаграмм. Для этого нужно кликнуть на  подпункт меню Найденные анаграммы пункта меню
Анаграммы. При этом откроется форма с таблицей содержащей результаты последних поисков
анаграммного спектра слов/выражений.

Второй режим поиска анаграмм называется поиском дополнений. Если обозначить заданные фрагменты начальной и конечной
части анаграммы как W и V, то во втором режиме ищутся два слова X и Y, такие, что W X == V Y то есть , W X V Y является
анаграммой, где W X – начальная часть, а V Y – конечная часть. Для начала генерации анаграммных дополнений нужно войти
в подпункт меню Генерация дополнений, ввести фрагменты начальной (левой) и конечной (правой) частей анаграммы (и только
одной из них) и кликнуть на кнопке Найти анаграммы. Процесс поиска также отражается в Мониторе активности заданий,
а результаты можно смотреть в Найденных анаграммах.

При поиске анаграмм можно задавать список запрещённых слов, посмотреть и отредактировать который,  можно через подпункт
меню Список запрещённых слов.
Очистить список найденных анаграмм можно посредством подпункта меню Очистить каталог анаграмм. При этом уничтожается
только список анаграмм, сами файлы с анаграммами остаются. Их можно удалить вручную в подпапке ANAGRAMMA. Они не
удаляются автоматически, так как вдруг они понадобятся. Анаграммы в этих папках можно смотреть с помощью обычного
 текстового редактора.

Генерация разнобуквиц (панграмм).


Разнобуквица это набор слов из словаря, в котором каждая буква встречается ровно по одному разу. Для генерации разнобуквиц
нужно выбрать пункт меню Разнобуквицы и затем Сгенерировать разнобуквицу. Откроется форма для задания условий на
поиск комбинации. Можно задать минимальное, максимальное или желаемое количество слов, существительных, глаголов
и прилагательных, которое должно присутствовать в искомой комбинации слов, которое реализует разнобуквицу.В отдельном
поле ввода можно задать слова, которые заведомо должны присутствовать в разнобуквице. Если эти слова (слово) не заданы,
то будет использован весь алфавит. Если желаемый набор слов (слово) задан, то соответствующие буквы будут исключены
из процесса поиска. Например, мы можем поискать продолжение неполной разнобуквицы “мы ужас” и получить какое-нибудь
продолжение. Это поле сделано для проведения вариантных расчетов разнобуквиц. Чтобы направленным выбрасыванием
отдельных слов двигаться в направлении разнобуквицы нужного состава.

Существует также список слов, которые запрещены постоянно. Через отдельный пункт меню его можно редактировать.
В него можно занести слова, присутствие которых нежелательно в разнобуквице во всех вариантах. в любом случае
В случае, если какая-то часть разнобуквицы уже задана, программа отработает значительно быстрее. Обычно же
нахождение полной разнобуквицы занимает около 3-5 минут. Чем больше ограничений (запрещённых и/или исключённых слов)
 задано, тем больше будет время решения задачи поиска разнобуквицы.

Задача поиска разнобуквицы сводится к решению задачи булева линейного программирования. Сначала составляется словарь
допустимых в разнобуквице слов. Слов, в которых каждая буква встречается не более одного раза. Таких слов около 347 тысяч.
Часть слов можно внести в списки постоянно или временно исключённых из процесса решения задачи слов.
Для каждого такова слова вводится булева переменная, то есть целочисленная переменная принимающая значения 0 или 1.
Единица означает, что данное слово входит в разнобуквицу, ноль – не входит. Для каждой из букв алфавита линейной суммой
по всем словам определяется сумма использованных в комбинации букв. В случае разнобуквицы для каждой буквы такая сумма
должна давать ровно 1.  То есть задача ЦЛП имеет около 347 тысяч переменных и 33 (по числу букв) ограничения.
В качестве критерия можно задавать

- минимальное количество слов
- максимальное количество слов
- минимальное количество существительных
- максимальное количество существительных
- минимальное количество глаголов
- максимальное количество глаголов
- минимальное количество прилагательных
- максимальное количество прилагательных

Можно также задавать дополнительные ограничения на количества слов, существительных, глаголов и прилагательных.
Для решения задачи ЦЛП применяется open source пакет LP_SOLVE.
Недостатком подхода является, то что в результате решения получается одна разнобуквица. Для получения других разнобуквиц
необходимо модифицировать условие задачи, например, внести какое-либо из слов в список исключаемых из решения слов.


Палиндромы.


Палиндром это текст, который читается одинаково слева направо и справа налево, за исключением некоторых послаблений:
замена 'и' на 'й', ‘ё’ на 'е', пропуск твёрдого и мягкого знаков.
В настоящее время программа может осуществить две функции связанные с палиндромами.

    Проверка текста на палиндромность
    Разложение палиндрома на элементарные неразложимые палиндромы.

Для  проверки текста на палиндромность необходимо кликнуть подпункт меню Проверить пункта меню Палиндромы.
Открывается форма, в которую необходимо ввести проверяемый текст. И нажать кнопку Проверить. Если текст является
палиндромом, то через некоторое время появится сообщение Это палиндром. Если текст не является палиндромом,
то появится сообщение с указанием несовпадающих символов, а также правой и левой частью текста до найденного
несовпадения.
Для  разложения палиндрома на элементарные палиндромы необходимо кликнуть подпункт меню Проверить пункта меню
Разложить.  Открывается форма, в которую необходимо ввести текст палиндрома. И нажать кнопку Проверить. В нижнем
многострочном поле будет выложено разложение палиндрома на элементарные неразложимые палиндромы, начиная с
внешнего уровня. Если палиндром слишком большой, то текст разложения будет открыт как текстовый файл, в текстовом
редакторе, который по умолчанию принят на компьютере для текстовых файлов.