점프 순서


19

다음 순서를 고려하십시오.

0 1 3 2 5 4 8 6 7 12 9 10 11 17 13 14 15 16 23 ...

패턴이없는 것처럼 보이죠? 작동 방식은 다음과 같습니다. 시작 0점프, n와, 정수를 n시작 1. 그것은 순서에서 다음 번호입니다. 그런 다음 "건너 뛴"숫자를 추가하고 아직 오름차순으로 보이지 않습니다. 그런 다음 n추가 된 마지막 숫자를 증가 시키고 점프하십시오. 이 패턴을 반복하십시오.

예를 들어에 도달 11하면에 n=5있습니다. 우리는으로 증가 n하고으로 n=6올라간 17다음 13 14 15 16아직 보이지 않았으므로 추가합니다. 다음 점프는 n=7이므로 시퀀스의 다음 요소는 23입니다.

도전

input이 주어지면 이 시퀀스의 첫 번째 항 , 시퀀스의 첫 번째 항을 x출력 하거나 시퀀스의 항에 대한 무한 목록을 작성하십시오. 0 또는 1 인덱싱을 선택할 수 있습니다.xx

I / O 및 규칙

  • 입력 및 출력은 편리한 방법 으로 제공 할 수 있습니다 .
  • 입력 및 출력은 해당 언어의 고유 번호 유형에 맞는 것으로 가정 할 수 있습니다.
  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.


@JayCe 나는 놀라지 않았다-그것은 꽤 임의의 순서이다.
AdmBorkBork

답변:


24

자바 스크립트 (ES7), 41 바이트

시퀀스 의 n 번째 항을 0- 인덱스로 반환합니다 .

n=>(d=(n--*8-23)**.5)%1?n:'121'[n]^n-~d/2

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

어떻게?

주요 사례 : >

순서의 처음 네 용어는 특별하므로 지금은 따로 두겠습니다.

대한 , 같은 순서 외모 :>

 n  | [4] 5 [6] 7 8 [ 9] 10 11 12 [13] 14 15 16 17 [18] 19 20 21 22 23 [24] 25 26 27 ...
----+------------------------------------------------------------------------------------
a(n)| [5] 4 [8] 6 7 [12]  9 10 11 [17] 13 14 15 16 [23] 18 19 20 21 22 [30] 24 25 26 ...
----+------------------------------------------------------------------------------------
 k  |  2  -  3  - -   4   -  -  -   5   -  -  -  -   6   -  -  -  -  -   7   -  -  - ...

실제로 두 개의 인터리브 된 서브 시퀀스가 ​​있음을 알 수 있습니다.

  • 대부분의 값은 다음과 같은 하위 시퀀스 에 속합니다 .

    ()=1
  • 일부 다른 값은 하위 시퀀스 (위의 다이어그램에서 괄호로 강조 표시됨) 에 속하며 그 색인은 산술 시퀀스 3, 3, 4, 6, 9, 13, 18, 24 ...를 따릅니다 .

    (,케이)=+케이1

    여기서 은 기본 시퀀스 의 인덱스 이고 k 는 하위 시퀀스 B 의 인덱스입니다 .케이

주요 순서에서 의 인덱스 는 다음과 같습니다.

케이=케이2케이+62

주어지면 , n 이 2 차 방정식의 정수 해인 경우 주 시퀀스에서 해당 항이 B에 속한다는 것을 알고 있습니다 .

엑스2엑스+62=0

누구의 판별이 :

Δ=14(62)=823

그리고 그 긍정적 인 해결책은 :

엑스=1+Δ2

우리는 √를 기대합니다 는 정수입니다. 따라서 테스트 :Δ

(d = (n-- * 8 - 23) ** .5) % 1

특수한 경우 : 0

들면 , 판별은 음극과의 제곱근 결과 복용 NaN이 . 를 들어 N = 3 의 판별은 1 . 따라서, 시퀀스의 처음 4 개의 항은 서브 시퀀스 B 에 속하는 것으로 간주됩니다 .<=1

표준 공식 n-~ d / 2를 적용 하면 다음과 같은 결과를 얻습니다.

12,12,2,

대신에:

0,1,,2

그래서 우리는 이러한 결과를 각각 XOR합니다 .0,1,2 과 1


10

껍질 , 12 바이트

Θṁṙ_1C+ḣ2tNN

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

무한 목록으로 출력합니다. 다음 은 첫 번째 N 을 인쇄하는 버전입니다 .

설명

Θṁṙ_1C + ḣ2tNN – 전체 프로그램. 입력을받지 않고 STDOUT으로 출력합니다.
         tN – 2부터 시작하여 무한한 자연수 목록을 구성합니다.
      + ḣ2 – 그리고 [1, 2]를 덧붙입니다. 수율 [1,2,2,3,4,5,6,7,8,9,10,11, ...].
     CN – 양의 정수의 무한 목록을 그 조각으로 자릅니다.
               크기. 수율 [[1], [2,3], [4,5], [6,7,8], [9,10,11,12], ...].
 ṁ – 그 후 결과를 매핑하고 평평하게합니다.
  ṙ_1 – 각각 오른쪽으로 1 단위 씩 회전합니다.
               수율 [1,3,2,5,4,8,6,7,12,9,10,11, ...]
Θ – 0 앞에 붙입니다. 수율 [0,1,3,2,5,4,8,6,7,12,9,10,11, ...]

7

하스켈 , 43 바이트

0:1:3:2:5!3
a!n=a:[a-n+2..a-1]++(a+n)!(n+1)

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

무한리스트를 정의합니다 :

  0:1:3:2:(5!3)
 0:1:3:2:5:4:(8!4)
 0:1:3:2:5:4:8:6:7:(12!5)
 0:1:3:2:5:4:8:6:7:12:9:10:11:(17!6)
 0:1:3:2:5:4:8:6:7:12:9:10:11:17:13:14:15:16:(23!7) 

4

젤리 , 15 바이트

+‘ɼṪRṙ-œ|@
0Ç¡ḣ

이것은 n이 주어지면 시퀀스 의 처음 n 개 항목을 인쇄 하는 전체 프로그램입니다 .

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

작동 원리

0Ç¡ḣ        Main link. Argument: n

0           Set the return value to 0.
 Ç¡         Call the helper link n times, first with argument 0, then n-1 times
            with the previous return value as argument.
   ḣ        Head; extract the first n items of the last return value.


+‘ɼṪRṙ-œ|@  Helper link. Argument: A (array)

 ‘ɼ         Increment the value in the register (initially 0) and yield it.
+           Add that value to all items in the sequence.
   Ṫ        Tail; extract the last item.
    R       Range; map k to [1, .., k].
     ṙ-     Rotate -1 units to the left, yielding [k, 1, ..., k-1].
       œ|@  Perform multiset union of A and the previous return value.

3

C (gcc), 73 67 64 바이트

t,d;f(x){for(t=4,d=2;d<x;t+=d++)x-t||(d+=x+=d);t=x<4?x^x/2:x-1;}

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

f인덱스가 0 인 함수 를 정의 하고 시퀀스에서 숫자를 n생성합니다 n.

시퀀스를 다음과 같이 분석 할 수 있습니다.

f(n)  = n   where n = 0, 1

f(2)  = 3   // 2 and 3 are swapped
f(3)  = 2

f(4)  = 5   // (+2,+3)
f(6)  = 8   // (+3,+4)
f(9)  = 12  // (+4,+5)
f(13) = 17  // (...)
...

f(n)  = n-1 // for all cases not yet covered

먼저 중간 섹션을 처리합니다.

for(t=4,d=2;d<x;t+=d++)x-t||(d+=x+=d);

왼쪽의 인수 (4, 6, 9, 13, ...)는 패턴을 따릅니다. 먼저 2를 더한 다음 3을 더한 다음 4를 더하는 등의 패턴을 따릅니다. 우리 는 루프의 각 반복에서 시작 하여 프로세스에 따라 증가하면서 (2에서 시작) t=4추가 합니다.dd

루프의 몸체가 더 흥미 롭습니다. 4-5, 6-8, 9-12 등을 매핑하고 싶다는 것을 기억하십시오. 그것은 is is 추가 d-1하는 것 x입니다 t. 그러나이 논리는 마지막 경우보다 먼저 나오므로 마지막에 f(n) = n - 11을 뺍니다. 따라서 단순히 dif x == t( x-t||(x+=d)) 를 추가 할 수 있습니다 . 그러나 우리는이 직후 루프의 탈옥해야합니다 - 우리가 추가 할 수 있도록 그렇게 하는 d얻기 위해 터무니-찾고 d+=x+=d, 항상하게되는 d<x상태가 실패합니다.

여기에는 처음 네 가지 값을 제외한 모든 것이 포함됩니다. 바이너리로 그것들을 보면, 우리는 다음을 얻습니다.

00 -> 00
01 -> 01
10 -> 11
11 -> 10

따라서 마지막 비트를 뒤집고 싶습니다 2 <= x < 4. 이것은로 달성됩니다 x^x/2. x/2두 번째로 최하위 비트를 제공하므로 숫자가 2 또는 3 인 경우 원래 숫자로 XOR하면 마지막 비트가 반전됩니다.


3

젤리 ,  13  10 바이트

-3 Dennis 덕분에 (0 인덱싱을 사용하여 누적 합계 설정에서 2를 절약하고 최종 감소)

Ḷ»2Äi+_>2$

0 인덱스 n 정수를 받아들이는 모나드 링크 는 정수 a (n) 를 반환합니다.

온라인으로 사용해보십시오! 또는 시험 스위트를 참조하십시오


좋은! 나는 ḶÄ+3i+’했지만 가장자리 사례를 처리하는 방법을 모른다.
Dennis

나는 또한 가지고 Ḷ»ạ¥3있다 Ḋ3,2;-이 비트에 대해 더 터무니없는 느낌.
Jonathan Allan

Ḷ»2Äi+_>2$0 기반 색인으로 3 바이트를 절약합니다.
Dennis

오 굉장한 골프! 나는 1 인덱스 땅에 갇혔다.
Jonathan Allan


2

MATL , 22 바이트

1y:"t0)@+h5M:yX-h]qw:)

n시퀀스 의 첫 번째 항을 출력합니다 .

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

설명

1         % Push 1
y         % Implicit input: n. Duplicate from below
":        % For each k in [1 2 ... n]
  t0)     %   Duplicate sequence so far. Get last entry, say m
  @+      %   Add k: gives m+k
  h       %   Concatenate horizontally
  5M      %   Push m+k again
  :       %   Range [1 2 ... m+k]
  y       %   Duplicate from below
  X-      %   Set difference
  h       %   Concatenate horizontally
]         % End
q         % Subtract 1, element-wise
w         % Swap. Brings original copy of n to the top
:)        % Keep the first n entries. Implicit display

나는 마지막에 smilie를 좋아합니다. 이제 모든 MATL 프로그램이 미소로 끝나기를 바랍니다. :)
sundar-복원 모니카

@sundar 네, MATL에서 비교적 일반적인 관용구 인 것이 행복합니다 :-D
Luis Mendo



1

Q 기본, 58 바이트

DO
b=r+j
?b
r=b
FOR x=a+1TO b-1
?x
r=x
NEXT
a=b
j=j+1
LOOP

무기한으로 출력합니다. SLEEP 1루프 내부 를 추가 하거나 LOOP WHILE b<100결과를보기 위해 루프 등을 만들 수 있습니다 .

이것은 기본적으로 사양을 구현합니다. 우리가 돌아가는 숫자는 항상 가장 최근에 점프 한 숫자와 그 이전에 점프 한 숫자 사이의 숫자가 될 것입니다. 우리는 이러한 경계로 저장할 수 있도록 a하고 b그리고 사용 FOR그들 사이의 모든 숫자를 인쇄하는 루프를.



1

R , 70 바이트

function(e){for(i in 1:e)F=c(setdiff((F+i):1-1,F),F[1]+i,F);rev(F)[e]}

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

  • 1- 색인
  • 사용하는 -4 바이트 F@JAD 제안 덕분에 상수를
  • @Giuseppe 제안 덕분에 목록을 뒤집는 -5 바이트
  • @JAD 제안 덕분에 for 루프에서 쓸모없는 괄호를 제거하는 -2 바이트
  • setdiff대신에 -2 바이트 사용x[x %in% y]

이전 버전 (79 바이트)



@JAD : 나는 항상 F / T를 사용하는 것을 잊었다. 나는 그것을 도울 수 없다. 나는 "안전하지 않은 코드"를 피하기 위해 너무 기울어졌다. : D
digEmAll

1
목록을 반대로 구성하면 5 bytes많은 경고가 저장 되고 경고가 발생합니다!
주세페

F/T함수 정의에서 재정의되지 않으면 안전하지 않습니다. F/T
JAD


1

파이썬 2 , 123 바이트

def f(z):[s.extend([s[-1]+n]+[x for x in range(s[-1]+1,s[-1]+n)if not x in s]) for n in range(1,z)if len(s)<z];return s    

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

입력 x가 주어지면 시퀀스의 처음 x 항을 출력합니다.

나는 파이썬을 배우고 있으며이 도전은 일을 더 흥미롭게 만듭니다.

편집 : 공백을 면도


PPCG에 오신 것을 환영합니다! 당신은 몇 가지 이상의 공백을 제거 얻을 수 있습니다 for n in range(1,z) if len(s) < z]; return s: for n in range(1,z)if len(s)<z];return s.
Laikoni



0

펄 6 , 52 바이트

(0,{((^max @_)∖@_).min.?key//(1+@_[*-1]+$++)}...*)

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

...연산자를 사용하는 생성기 표현식 입니다. 다음을 @_통해 이전 순서에서 간격을 찾습니다 ((^max @_)∖@_).min.?key.

      @_  # prior sequence values         [0,1,3]
  max @_  # largest prior sequence value       3
 ^        # the Range 0..max @_            0,1,2
(       )∖@_  # set subtract prior seq     -0,1  -> (2=>True)
            .min  # smallest unseen value  2=>True
                .?key  # set yields pairs  2

?없는 초기 값에는가 필요합니다 .key. 간격이 없으면 $목록의 마지막 값에 n (여기 변수에 있음)을 더한 다음 0 오류에 의해 1을 더합니다.


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