ИЗМЕНИТЬ: см. Решение проблемы, кому принадлежит Zebra программно? для аналогичного класса задач
В LSAT есть категория логических проблем, которая выглядит следующим образом:
Семь последовательных временных интервалов для трансляции, пронумерованных в хронологическом порядке от I до 7, будут заполнены шестью лентами с песнями - G, H, L, O, P, S - и ровно одной лентой новостей. Каждой ленте назначается отдельный временной интервал, и ни одна лента не длиннее любой другой ленты. Трансляция подчиняется следующим ограничениям:
L должна воспроизводиться непосредственно перед O.
Лента новостей должна воспроизводиться через некоторое время после L.
Должно быть ровно два временных интервала между G и P, независимо от того, идет ли G до P или G после P.
Я заинтересован в создании списка перестановок, удовлетворяющих условиям, как способ подготовки к тесту и как задача программирования. Однако я не уверен, что это за класс проблемы перестановки. Я обобщил проблему типов следующим образом:
Для массива A длиной n:
- Сколькими способами можно расположить набор из n уникальных элементов в пределах A? Например. Сколько существует способов переставить ABCDEFG?
- Если длина набора уникальных элементов меньше длины A, сколькими способами можно расположить набор внутри A, если элементы в наборе могут встречаться более одного раза? Например. ABCDEF => AABCDEF; ABBCDEF и др.
- Какими способами можно расположить набор уникальных элементов в пределах A, если элементы набора подпадают под «условия блокировки»?
Моя мысль - закодировать ограничения, а затем использовать что-то вроде itertools Python для генерации перестановок. Мысли и предложения приветствуются.