Kolakoski와 같은 자체 참조 시퀀스


19

이것이 Kolakoski 시퀀스 (OEIS A000002 )를 정의하는 방법입니다.

Kolakoski 서열을 포함하는 서열이다 1하고 2, 상기 n시퀀스의 번째 요소의 길이 n시퀀스 자체가 동일한 요소 (RUN)의 일 기. 시퀀스의 처음 20 개 항과 각 길이는 다음과 같습니다.

1 2 2 1 1 2 1 2 2 1 2 2 1 1 2 1 1 2 2 1
- --- --- - - --- - --- --- - --- --- -
1  2   2  1 1  2  1  2   2  1  2   2  1

기본적으로 Kolakoski 시퀀스의 동일한 요소 그룹의 길이는 Kolakoski 시퀀스 자체입니다.

지금까지는 훌륭했지만, 왜 우리 자신 1과를 제한해야 2합니까? 우리는하지 않을 것입니다! 양의 정수 A와 정수로 구성된 두 개의 입력이 주어지면 을 순환하여 정의 된 Kolakoski와 같은 시퀀스 N의 첫 번째 N항을 반환합니다 A. 이해를 돕기 위해 새로 추가 된 그룹의 길이를 괄호로 묶은 예제가 있습니다.

A = [2, 3, 1]
N = 25

2: [[2], 2 ]
3: [ 2 ,[2], 3 , 3 ]
1: [ 2 , 2 ,[3], 3 , 1 , 1 , 1 ]
2: [ 2 , 2 , 3 ,[3], 1 , 1 , 1 , 2 , 2 , 2 ]
3: [ 2 , 2 , 3 , 3 ,[1], 1 , 1 , 2 , 2 , 2 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 ,[1], 1 , 2 , 2 , 2 , 3 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 ,[1], 2 , 2 , 2 , 3 , 1 , 2 ]
3: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 ,[2], 2 , 2 , 3 , 1 , 2 , 3 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 ,[2], 2 , 3 , 1 , 2 , 3 , 3 , 1 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 ,[2], 3 , 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 ]
3: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 ,[3], 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 ,[1], 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 1 ,[2], 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 , 2 , 2 ]
C: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 , 2 , 2 ]

다음은 주요한 예제입니다 1.

A = [1, 2, 3]
N = 10

1: [[1]]
2: [ 1 ,[2], 2 ]
3: [ 1 , 2 ,[2], 3 , 3 ]
1: [ 1 , 2 , 2 ,[3], 3 , 1 , 1 , 1 ]
2: [ 1 , 2 , 2 , 3 ,[3], 1 , 1 , 1 , 2 , 2 , 2 ]
C: [ 1 , 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 ]

위에서 볼 수 있듯이 최종 결과는 N = 10요소 로 잘 렸습니다 . n번째 요소는 얼마나 있어야 n동등한 요소 일 기이고, 소자 자체는 그것이 참조하는 그룹에 속하는 경우에도. 위의 경우에서와 같이, 첫 번째 1는 첫 번째 그룹을 의미 1하며, 첫 번째 2는 두 번째 그룹을 의미합니다.

규칙

  • A두 개 이상의 연속 된 동일한 요소를 가지지 않을 것이라고 가정 할 수 있습니다 . A번 이상 정수를 포함 할 수 있지만, 첫 번째 및 마지막 요소는 동일하지 않으며, A적어도 두 요소를 포함한다 (예를 [1, 2, 2, 3], [2, 4, 3, 1, 2][3]부여하지 않을). 연속 된 동일한 요소가있는 경우 최종 결과는 이러한 시퀀스에 대해 잘못된 접두사가 되었기 때문입니다.
  • A양의 정수만 포함 한다고 가정 할 수 있습니다 (그러한 순서는 달리 정의되지 않으므로).
  • N음수가 아닌 정수 ( N >= 0) 라고 가정 할 수 있습니다 .
  • 요청한 것보다 더 많은 조건을 반환 할 수 없습니다.
  • 표준 허점 중 하나를 사용하는 것은 엄격히 금지되어 있습니다.
  • 합리적인 I / O 방법을 사용할 수 있습니다 .
  • 당신의 대답은 자연 언어 제한을 넘어서 작동 할 필요는 없지만 이론적으로 알고리즘은 임의로 큰 입력과 정수에 대해 작동해야합니다 .
  • 이것은 이므로 가장 짧은 답변이 이깁니다.

테스트 사례

[5, 1, 2], 0 -> []
[2, 3, 1], 25 -> [2, 2, 3, 3, 1, 1, 1, 2, 2, 2, 3, 1, 2, 3, 3, 1, 1, 2, 2, 3, 3, 3, 1, 2, 2]
[1, 2, 3], 10 -> [1, 2, 2, 3, 3, 1, 1, 1, 2, 2]
[1, 2], 20 -> [1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1]
[1, 3], 20 -> [1, 3, 3, 3, 1, 1, 1, 3, 3, 3, 1, 3, 1, 3, 3, 3, 1, 1, 1, 3]
[2, 3], 50 -> [2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 2, 3, 3]
[7, 4], 99 -> [7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4]
[1, 2, 3], 5 -> [1, 2, 2, 3, 3]
[2, 1, 3, 1], 2 -> [2, 2]
[1, 3, 5], 2 -> [1, 3]
[2, 3, 2, 4], 10 -> [2, 2, 3, 3, 2, 2, 2, 4, 4, 4]



@MartinEnder는 내가 이미 연결했다고 생각했습니다
Erik the Outgolfer

답변:


9

껍질 , 8 바이트

Ṡωȯ↑⁰`Ṙ¢

먼저 길이를 취한 다음 목록을 가져옵니다. 온라인으로 사용해보십시오!

설명

Ṡωȯ↑⁰`Ṙ¢  Inputs: n=9 and x=[2,1,3]
Ṡωȯ       Apply the following function to x until a fixed point is reached:
           Argument is a list, say y=[2,2,1,3,3,3]
       ¢   Cycle x: [2,1,3,2,1,3..
     `Ṙ    Replicate to lengths in y: [2,2,1,1,3,2,2,2,1,1,1,3,3,3]
   ↑⁰      Take first n elements: [2,2,1,1,3,2,2,2,1]
          Final result is [2,2,1,1,3,2,1,1,1], print implicitly.

8

Pyth, 14 바이트

u<s*V]M*QlGGvz

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

설명:

u                 start with G = input array
       *QlG       repeat input array
     ]M           put every element into its own list
   *V      G      repeat every list vectorized by the counts in G
  s               flatten
 <          vz    take the first (second input line) numbers
                  and assign them to G until you reach fixed point

흥미로운 대안 :u&VSvzs*V]M*Ql
Jakube

1
이것은 좋은 접근 방법입니다.
Outgolfer Erik

5

자바 8 151 + 19 119 115 바이트

a->n->{int c=0,l[]=new int[n],i=0,j;for(;i<n;i++)for(j=0;j<(c==i?a[i]:l[i])&c<n;j++)l[c++]=a[i%a.length];return l;}

온라인으로 사용해보십시오!


1
당신은 두 개의 괄호를 제거 점점 변경하여 4 바이트를 줄일 수 &&&쉼표를 제거 : a->n->{int c=0,l[]=new int[n],i=0,j;for(;i<n;i++)for(j=0;j<(c==i?a[i]:l[i])&c<n;j++)l[c++]=a[i%a.length];return l;}( 115 바이트 )
케빈 Cruijssen

(c==i?a:l)[i]대신 제안c==i?a[i]:l[i]
천장 고양이

5

R , 120 (114) 108 바이트

plannapus 덕분에 -6 바이트

function(A,N){i=inverse.rle
w=length
a=rle(A)
while(w(a$l)<N){a[[1]]=i(a)
a[[2]]=rep(A,l=w(a$l))}
i(a)[0:N]}

온라인으로 사용해보십시오!

익명의 기능; RLE을 연속적으로 반전시켜 길이 a[[1]]를 반전 된 RLE로 바꾸고 값 을의 길이와 동일한 길이 a[[2]]A복제합니다 a$l.


@plannapus 아, 맞아! 나는 그것을 시도했고 R이 충돌하여 할당 할 때 생성 a$l하고 a$v존재하지 않으면 R 에 대한 호출에 영향을 미치지 않으므로 inverse.rle무한 루프가 발생합니다. 내가에만 사용할 수 있다고 생각 a$lwhile조건과 rep상태.
주세페

5

하스켈 , 68 바이트

Laikoni와 flawr에게 PPCG Haskell chatroom, Of Monads and Men 에서이 답변을 디버깅하고 골프를 치는 데 도움을 주신 많은 분들께 감사드립니다 . 골프 제안을 환영합니다! 온라인으로 사용해보십시오!

(.f).take
f a@(z:_)=(z<$[1..z])++do i<-[1..];cycle a!!i<$[1..f a!!i]

첫 번째 줄은 익명 함수입니다. 두 번째 줄은 Kolakoski와 같은 시퀀스를 생성하는 무한 목록 이해입니다.

설명

먼저 with z의 헤드로 정의 합니다 . 그런 다음 시퀀스를 초기화합니다.aa@(z:_)(z<$[1..z]) .

그런 다음 1부터는 do i<-[1..]시퀀스에 다음을 추가합니다. cycle a!!i<$[1..f a!!i], 이는 추가 된 시간 ia(제한없이 순환 된) 멤버입니다 f a!!i.

마지막으로 익명 함수는 단순히 nKolaskoski와 같은 시퀀스 의 첫 번째 용어를 취합니다 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.