Циклы в кодировании длин серий


27

Рассмотрим некоторую двоичную последовательность, используя 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достаточно большими.

Смежные вопросы


1
Можем ли мы вывести список генераторов?
CalculatorFeline

@CatsAreFluffy Нет, прости. (Может быть в следующий раз ...)
Мартин Эндер

Ответы:


6

CJam (41 байт)

{Ma*{1:Bm<{1+ee{(1&B^)+}%e~A<0:B;}%}@:A*}

Это анонимная функция, которая принимает входные данные в стеке в порядке n kи оставляет выходные данные в стеке.Онлайн демо

Основная идея состоит в том, чтобы начать со словосочетания Линдона [2 1 1 1 ...]и итеративно расширить его на том основании, что, зная начальный элемент каждой строки и чередование, мы можем декодировать по длине прогона и получить больше элементов.


3

Haskell, 72 байта

~(a:b)?c=c:[c|a>1]++b?(3-c)
k!n=take k$take n<$>last(k!n)?2:map(?1)(k!n)

Демо-версия:

*Main> 4!20
[[2,1,1,2,2,1,2,2,1,2,1,1,2,1,1,2,2,1,2,1],[1,1,2,1,2,2,1,1,2,1,1,2,2,1,2,2,1,2,1,1],[1,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,2],[1,2,2,1,2,1,1,2,1,2,2,1,1,2,1,1,2,1,2,2]]

1
Хорошая работа, наконец! :) Не могли бы вы добавить объяснение тем, кто не пользуется Haskell? :)
Мартин Эндер

0

APL (Dyalog Unicode) , 35 байт

{(⍺↑¨⊣{⍵/(≢⍵)⍴⍺,3-⍺}¨¯1⌽⊢)⍣≡⍨1+⍵↑1}

Попробуйте онлайн!

Анонимный dfn, левый аргумент nи правый k.

Почти прямой перевод ответа Андерса Касерга на Haskell (адаптированный к конечной и строгой природе массивов APL) с небольшим намеком на идею Питера Тейлора :

Основная идея состоит в том, чтобы начать со словосочетания Линдона [2 1 1 1 ...]и итеративно расширить его на том основании, что, зная начальный элемент каждой строки и чередование, мы можем декодировать по длине прогона и получить больше элементов.

Как это работает

{(⍺↑¨⊣{⍵/(≢⍵)⍴⍺,3-⍺}¨¯1⌽⊢)⍣≡⍨1+⍵↑1}   left argument(⍺)←n, right(⍵)←k
                             1+⍵↑1    u←[2, 1, ..., 1] of length k
                                     Run the following with both sides being u:
 (                       )⍣≡           Repeat until fixpoint:
                                       (left: u, right: intermediate result v)
                     ¯1⌽⊢               Rotate v down once
     ⊣{                               Zip with left side u: (left elem u_i, right elem v_i)
              ⍺,3-⍺                      Make a 2-elem array [u_i, 3-u_i] which is [1 2] or [2 1]
         (≢⍵)⍴                           Cycle the above to the length of v_i
       ⍵/                                Duplicate each element of above v_i times e.g. 1 1 2/2 1 2  2 1 2 2
       ⍵/(≢⍵)⍴⍺,3-⍺                      Run-length decode v_i with alternating 1 and 2's, starting with u_i
  ⍺↑¨                                ⍝   Extend or truncate each row to length n

Сравнение с версией Андерса на Haskell

Код Андерса на Haskell (для ясности заключенный в скобки) работает следующим образом:

~(a:b)?c=(c:[c|a>1])++(b?(3-c))
  (c:[c|a>1])  -- Two copies of c if head of x > 1, one copy otherwise
  ++(b?(3-c))  -- Run-length decode the rest with alternating 1 and 2

k!n=take k$take n<$>((last(k!n))?2):(map(?1)(k!n))
  take k$         -- take first k rows
  take n<$>       -- take first n elements from each row
  ((last(k!n))?2) -- run-length decode the last row with starting value 2
  :(map(?1)(k!n)) -- run-length decode the other rows with starting value 1

В одной итерации это эквивалентно «добавлению k-й строки, декодированию длины строки каждой строки и затем отбрасыванию последней строки». Мы можем упростить его до «поворота один раз и декодирования по длине прогона», который я реализовал как ¯1⌽.

Для функции декодирования по длине прогона я просто использовал примитив APL /, в то время как версия Haskell использует бесконечные списки для его реализации.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.