킴 벌링 시퀀스


18

소개

물론 많은 문제가 있으므로 여기 또 다른 문제가 있습니다.

킴 벌링 시퀀스 ( A007063 )는 다음과 같습니다.

1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, ...

이것은 일반적인 반복을 섞어서 생성됩니다.

[1] 2  3  4  5  6  7  8

순서의 첫 번째 항은입니다 1. 그런 다음 왼쪽의 모든 용어가 사용될 때까지 순서를 다시 섞습니다. 셔플 링 패턴이 right - left - right - left - ...있습니다. 왼쪽에 용어 1가 없으므로 셔플 링이 없습니다. 우리는 다음을 얻습니다.

 2 [3] 4  5  6  7  8  9

i 번째 반복에서는 i 번째 항목을 버리고 시퀀스에 넣습니다. 이것은 두 번째 반복이므로 두 번째 항목을 버립니다 . 순서는 다음과 같습니다 1, 3.. 다음 반복에서는 위의 패턴으로 현재 반복을 섞습니다. 첫 번째 미사용 품목을 i 번째 품목 의 오른쪽에 가져갑니다 . 이 발생합니다 4. 우리는 이것을 새로운 반복에 추가 할 것입니다 :

 4

이제 i 번째 항목 의 왼쪽에서 사용하지 않은 첫 번째 항목을 가져옵니다 . 이것은입니다 2. 우리는 이것을 새로운 반복에 추가 할 것입니다 :

 4  2

i 번째 항목 의 왼쪽에 남은 항목이 없으므로 나머지 시퀀스를 새 반복에 추가합니다.

 4  2 [5] 6  7  8  9  10  11  ...

이것은 세 번째 반복이므로 세 번째 항목 인을 삭제합니다 5. 이것은 우리 순서의 세 번째 항목입니다.

 1, 3, 5

다음 반복을 얻으려면 프로세스를 반복하십시오. 명확하지 않은 경우 GIF를 만들었습니다.

여기에 이미지 설명을 입력하십시오

GIF는 실제 게시물을 쓰는 것보다 시간이 더 걸렸습니다.

직무

  • 음수가 아닌 정수 n이 주어지면 시퀀스 의 처음 n 항을 출력합니다
  • 기능이나 프로그램을 제공 할 수 있습니다
  • 이것은 이므로 바이트 수가 가장 적은 제출이 승리합니다!

테스트 사례 :

Input: 4
Output: 1, 3, 5, 4

Input: 8
Output: 1, 3, 5, 4, 10, 7, 15, 8

Input: 15
Output: 1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28

참고 : 출력에 쉼표가 필요하지 않습니다. 예를 들어 개행을 사용하거나 목록 등을 출력 할 수 있습니다.


저는 스택 회전을 사용하는 방법을 연구 중입니다
Cyoce

@Cyoce 행운을 빕니다 :)
Adnan

그것은 필요할 것 같습니다
Cyoce

답변:


3

Pyth, 22 바이트

JS*3QVQ@JN=J.i>JhN_<JN

온라인으로 사용해보십시오 : 데모

OP에 설명 된 셔플 링 기술 만 수행하면됩니다.

설명:

JS*3QVQ@JN=J.i>JhN_<JN
JS*3Q                    assign the list [1, 2, ..., 3*input-1] to J
     VQ                  for N in range(Q):
       @JN                  print J[N]
            .i              interleave 
              >JhN             J[N+1:] with
                  _<JN         reverse J[:N]
          =J                assign the resulting list to J

6

줄리아, 78 71 바이트

n->[(i=j=x;while j<2i-3 j=i-(j%2>0?1-j:j+22;i-=1end;i+j-1)for x=1:n]

이것은 정수를 허용하고 정수 배열을 반환하는 명명되지 않은 함수입니다. 호출하려면 변수에 지정하십시오.

여기에서의 접근 방식은 OEIS에서 설명한 것과 동일합니다.

언 골프 드 :

# This computes the element of the sequence
function K(x)
    i = j = x
    while j < 2i - 3
        j = i - (j % 2 > 0 ? 1 - j : j + 22
        i -= 1
    end
    return i + j - 1
end

# This gives the first n terms of the sequence
n -> [K(i) for i = 1:n]

Mauris 덕분에 7 바이트를 절약했습니다!


3

Mathematica 130 바이트

(n=0;s={};Nest[(n++;AppendTo[s,z=#[[n]]];Flatten[TakeDrop[#,1+2(n-1)]/.{t___,z,r___}:> 
Riffle[{r},Reverse@{t}]])&,Range[3*#],#];s)&

우리는 목록의 범위로 이루어지는 시작 1하는 3xxKimberling 서열 조건의 바람직한 수이다.

각 단계에서 n, TakeDrop현재 목록을 작업의 첫 2n+1번째 용어 목록 (작업이 수행되는 곳)과 후면 목록 (나중에 재 작업 된 첫 번째 목록과 결합 됨) 으로 나눕니다 . 프론트리스트는 다음 패턴과 일치합니다. {t___,z,r___}여기서 z는 프론트리스트의 중심에있는 킴 벌링 용어입니다. r이다 Riffle의 역방향와 D ' t그리고 후방리스트가 추가된다. 킴 벌링 (Kimberling) 서열이 성장하고 z( AppendTo)에 추가된다 .

n를 통해 증가 1하고 현재 목록은 다음을 통해 동일한 기능으로 처리됩니다.Nest.


(n=0;s={};Nest[(n++;AppendTo[s,z=#[[n]]];Flatten[TakeDrop[#,1+2(n-1)]/.{t___,z,r___}:> 
Riffle[{r},Reverse@{t}]])&,Range[3*#],#];s)&[100]

{1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, 42, 35, 33, 46, 53, 6, 36, 23, 2 , 55, 62, 59, 76, 65, 54, 11, 34, 48, 70, 79, 99, 95, 44, 97, 58, 84, 25, 13, 122, 83, 26, 115, 82, 91 , 52, 138, 67, 90, 71, 119, 64, 37, 81, 39, 169, 88, 108, 141, 38, 16, 146, 41, 21, 175, 158, 165, 86, 191, 45 , 198, 216, 166, 124, 128, 204, 160, 12, 232, 126, 208, 114, 161, 156, 151, 249, 236, 263, 243, 101, 121, 72, 120, 47, 229 }


2

파이썬 2, 76 바이트

for a in range(input()):
 b=a+1
 while-~b<2*a:b=a-(b^b%-2)/2;a-=1
 print a+b

설명

이것은 많은 golfy 변환 후의 OEIS 공식입니다! 그것은 아름답게 운동했다 . 원래 코드는

i=b=a+1
while b<2*i-3:b=i-(b+2,1-b)[b%2]/2;i-=1
print i+b-1

나는 먼저 i그것을 없애고 그것을 a+1모든 곳으로 바꾸고 표현을 확장했습니다.

b=a+1
while b<2*a-1:b=a+1-(b+2,1-b)[b%2]/2;a-=1
print a+b

그리고, 재 작성 b<2*a-1으로 -~b<2*a공백의 바이트를 저장하고, 이동하는 +1(2)에 의해, 선택으로 분열 및 부정 :

while-~b<2*a:b=a-(b,-b-1)[b%2]/2;a-=1

그렇다면, -b-1그냥 ~b쓸 수 있습니다 (b,~b)[b%2]. 이것은 b^0 if b%2 else b^-1XOR 연산자 를 사용하는 것과 동일합니다 b^b%-2.

while-~b<2*a:b=a-(b^b%-2)/2;a-=1

2

Pyth, 29 25 바이트

VQ+.W<hHyN-~tN/x%Z_2Z2hNN

Jakube는 4 바이트를 절약했지만 더 이상 코드를 읽는 방법에 대한 단서가 없습니다.

오래된 해결책은 다음과 같습니다.

VQKhNW<hKyN=K-~tN/x%K_2K2)+KN

내 파이썬 답변의 번역. 나는 Pyth를 잘하지 못하므로 이것을 단축시키는 방법이 여전히있을 수 있습니다.

VQ                              for N in range(input()):
  KhN                             K = N+1
     W<hKyN                       while 1+K < 2*N:
           =K-~tN/x%K_2K2)         K = (N--) - (K%-2 xor K) / 2
                          +KN     print K + N

.W4 바이트를 골프 오프 할 수 있습니다 : VQ+.W<hHyN-~tN/x%Z_2Z2hNN.
Jakube

멋지다-어떻게 작동하는지 대략적으로 설명해 주시겠습니까?
Lynn

1
.W형식이 있습니다 : .W<condition><apply><start-value>. 나는 hN당신이했던 것처럼 시작 값을 사용 했습니다 KhN. .W이 값 <condition>이 true 인 한이 값을 변경 합니다. 나는 당신과 같은 조건을 사용했습니다 <hHyN. 조건은 매개 변수가있는 람다 함수 H이므로 코드의 현재 값 KH입니다. 그리고 나는 또한 <apply>당신 과 같은 문장을 사용했습니다 .이 문장은 매개 변수가있는 람다 함수 이기 때문에 로만 바꿨 K습니다 . 우리는 무시할 수 있습니다 , 이 문제를 처리합니다. 이전 값을 계산 된 값으로 바꿉니다. 인쇄 종료시Z<apply>Z=K.W+...N
Jakube

2

APL, 56 44 바이트

{⍵<⍺+⍺-3:(⍺-1)∇⍺-4÷⍨3+(1+2×⍵)ׯ1*⍵⋄⍺+⍵-1}⍨¨⍳

이것은 이름이없는 모나 딕 기차로 오른쪽에 정수를 허용하고 배열을 반환합니다. 내 Julia 답변 과 거의 동일한 접근 방식 입니다.

최 함수 복귀하는 순환 이항 함수 N Kimberling 서열 번째 항은 주어진 N 개의 동일하게 좌우로 인수.

{⍵<⍺+⍺-3:                                    ⍝ If ⍵ < 2⍺ - 3
         (⍺-1)∇⍺-4÷⍨3+(1+2×⍵)ׯ1*⍵           ⍝ Recurse, incrementing a and setting
                                             ⍝ ⍵ = ⍺ - (3 + (-1)^⍵ * (1 + 2⍵))/4
                                   ⋄⍺+⍵-1}   ⍝ Otherwise return ⍺ + ⍵ - 1

이를 통해 시퀀스의 개별 항을 얻을 수 있습니다. 그러나 문제는 이것이 2 차원 함수이므로 양쪽에 인수가 필요하다는 의미입니다. 운영자를 입력하십시오 ! 함수 주어 f와 입력 x, f⍨x와 동일하다 x f x. 따라서 앞에서 언급 한 함수를로 언급 f하면 다음과 같은 모나 딕 트레인을 구성 할 수 있습니다.

f⍨¨⍳

f1부터 입력까지 각 정수에 적용 하여 배열을 생성합니다.

Dennis 덕분에 12 바이트를 절약했습니다!

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