Интересна последовательность де Брюина: это самая короткая циклическая последовательность, которая содержит все возможные последовательности данного алфавита заданной длины. Например, если мы рассматривали алфавит A, B, C и длину 3, возможный вывод:
AAABBBCCCABCACCBBAACBCBABAC
Вы заметите , что все возможные последовательности 3 символов , используя буквы A
, B
и C
находятся там.
Ваша задача состоит в том, чтобы сгенерировать последовательность де Брюина, используя как можно меньше символов. Ваша функция должна принимать два параметра: целое число, представляющее длину последовательностей, и список, содержащий алфавит. Ваш вывод должен быть последовательностью в форме списка.
Вы можете предположить, что каждый элемент в алфавите отличается.
Пример генератора можно найти здесь
Применяются стандартные лазейки
источник
Ответы:
Pyth, 31 байт
Это прямое преобразование алгоритма, использованного в моем ответе CJam . Советы по игре в гольф приветствуются!
Этот код определяет функцию,
g
которая принимает два аргумента, строку списка символов и число.Пример использования:
Выход:
Расширение кода:
Попробуй здесь
источник
CJam,
52 4948 байтовЭто на удивление долго. Это может быть много в гольфе, учитывая советы из перевода Pyth.
Ввод идет как
т.е. - строка списка символов и длины.
и вывод строки De Bruijn
Попробуйте онлайн здесь
источник
CJam,
5249 байтовВот другой подход в CJam:
Принимает ввод, как это:
и производит работу Линдона как
Попробуй это здесь.
Это использует связь со словами Линдона . Он генерирует все слова Линдона длины n в лексикографическом порядке (как описано в той статье Википедии), а затем отбрасывает те, чья длина не делит n . Это уже дает последовательность Де Брюина, но, поскольку я генерирую слова Линдона в виде цепочек цифр, мне также нужно заменить их соответствующими буквами в конце.
По причинам, связанным с игрой в гольф, я считаю, что более поздние буквы в алфавите имеют более низкий лексикографический порядок.
источник
JavaScript (ES6) 143
Используя слова Линдона, как у Мартина aswer, всего в 3 раза длиннее ...
Тест в консоли FireFox / FireBug
Выход
источник
Python 2, 114 байт
Я не совсем уверен, как играть в гольф больше, из-за моего подхода.
Попробуйте онлайн
Ungolfed:
Этот код является тривиальной модификацией моего решения для более поздней задачи.
Единственная причина, по которой
[:1-n]
это необходимо, заключается в том, что последовательность включает в себя циклический переход.источник
Powershell,
16496 байт-68 байт с -match
O($n*2^n)
вместо рекурсивного генератораO(n*log(n))
Ungolfed & тестовый скрипт:
Выход:
Смотрите также: Одно Кольцо, чтобы править ими всеми. Одна строка, чтобы содержать их всех
источник