실행 길이 인코딩의주기


26

사용, 일부 이진 순서를 고려 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의 사이클 길이 (즉,이 변환의 고정 점)에 대해 Oldenburger-Kolakoski 시퀀스 (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 항목 A025142A025143 입니다. 이것이 유일한 솔루션입니다.)

길이 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. 그지도가이 도전과 어떤 관계가 있는지 알아 내면 쿠키를 얻게됩니다.

도전

사이클 길이 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 아니요, 죄송합니다. (다음 번에 ...)
Martin Ender

답변:


6

CJam (41 바이트)

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

이것은 익명의 함수로 스택에 입력을 받아 스택에 n k출력을 남깁니다. 온라인 데모

기본 아이디어는 Lyndon 단어 열로 시작하고 [2 1 1 1 ...]각 행의 초기 요소와 우리가 실행 길이 디코딩을 수행하고 더 많은 요소를 얻을 수있는 교대를 알고 있다는 사실에 기초하여 반복적으로 확장됩니다.


3

하스켈, 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을 모르는 사람들을 위해 설명을 추가해 주시겠습니까? :)
Martin Ender 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.