Рассмотрим некоторую двоичную последовательность, используя 1
и 2
, например:
1, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1 ...
Давайте запишем длины прогонов этого:
1, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1 ...
_ _ ____ ____ _ _ _ ____
1, 1, 2, 2, 1, 1, 1, 2, ...
В этом случае мы получаем другую двоичную последовательность. Конечно, это не гарантировано (например, если мы повторим процесс, третий запуск будет 3
), но давайте предположим, что мы делаем.
Теперь вопрос в том, можем ли мы найти последовательность, такую, что применение этого типа кодирования длин серий многократно возвращает нам исходную последовательность? Для длины цикла 1 (т. Е. Фиксированной точки этого преобразования) мы находим последовательность Ольденбургера-Колакоски (запись OEIS A0000002 ):
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, ...
(На самом деле есть другое решение: мы также можем опустить ведущие 1
.)
А как насчет цикла длины-2? Это тоже возможно! Следующие две последовательности являются списком длин серий друг друга:
1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, ...
2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, ...
(Это записи OEIS A025142 и A025143 . Это единственное решение.)
Можем ли мы найти цикл длины 3? Конечно, здесь каждая последовательность является кодированием длины серии следующего (а третья является кодированием длины серии первого):
1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, ...
1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, ...
2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, ...
В этом случае есть еще одно решение. Оказывается, мы можем найти такой цикл для любой длины цикла. Фактически, число отдельных циклов длины n задается записью OEIS A001037 (это не учитывает произвольный выбор того, какая последовательность в цикле считается первой).
Интересный факт: маловероятно, что этот вызов был вдохновлен изучением сложной карты f(z) = z - 1/z
. Кто бы ни выяснил, что эта карта имеет отношение к этой проблеме, получает cookie.
Соревнование
При заданной длине цикла и длине k > 0
последовательности n > 0
выведите первые n
члены k
различных (бесконечных) двоичных последовательностей, которые образуют цикл при указанном выше преобразовании длины серии. Если существует несколько циклов, вы можете вывести любой из них. Вам решать, с какой последовательности в цикле начинать и в каком направлении идет цикл (так что вы можете либо вывести их так, чтобы каждая последовательность описывала следующую, либо чтобы каждая последовательность описывала предыдущую, циклически).
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Выходные данные могут быть в любом удобном, однозначном, вложенном формате списка, так что внешнее измерение - k
это внутреннее измерение n
.
Применяются стандартные правила игры в гольф .
Дополнительные примеры
Вот несколько примеров. Но, как я уже сказал, решения не являются уникальными, поэтому ваши собственные решения могут отличаться и при этом быть правильными. Может быть, это поможет вам найти решение, хотя. Каждый пример k n
сопровождается последовательностями, так что каждая строка описывает следующее (циклически):
4 20
1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2
2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1
2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1
1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1
5 6
2, 2, 1, 2, 2, 1
1, 1, 2, 2, 1, 2
2, 1, 2, 2, 1, 1
1, 1, 2, 1, 1, 2
2, 1, 2, 2, 1, 2
8 20
2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2
1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1
2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2
2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2
1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1
2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2
1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1
2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1
13 50
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1
1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1
1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1
1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1
1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1
Обратите внимание, что не все строки в последних двух выходах отличаются, хотя в конечном итоге они будут n
достаточно большими.
Ответы:
CJam (41 байт)
Это анонимная функция, которая принимает входные данные в стеке в порядке
n k
и оставляет выходные данные в стеке.Онлайн демоОсновная идея состоит в том, чтобы начать со словосочетания Линдона
[2 1 1 1 ...]
и итеративно расширить его на том основании, что, зная начальный элемент каждой строки и чередование, мы можем декодировать по длине прогона и получить больше элементов.источник
Haskell, 72 байта
Демо-версия:
источник
APL (Dyalog Unicode) , 35 байт
Попробуйте онлайн!
Анонимный dfn, левый аргумент
n
и правыйk
.Почти прямой перевод ответа Андерса Касерга на Haskell (адаптированный к конечной и строгой природе массивов APL) с небольшим намеком на идею Питера Тейлора :
Как это работает
Сравнение с версией Андерса на Haskell
Код Андерса на Haskell (для ясности заключенный в скобки) работает следующим образом:
В одной итерации это эквивалентно «добавлению k-й строки, декодированию длины строки каждой строки и затем отбрасыванию последней строки». Мы можем упростить его до «поворота один раз и декодирования по длине прогона», который я реализовал как
¯1⌽
.Для функции декодирования по длине прогона я просто использовал примитив APL
/
, в то время как версия Haskell использует бесконечные списки для его реализации.источник