이 도전은 재귀에 관한 것입니다 (Cops의 스레드)


15

경찰의 실

이 스레드에서, 당신의 작업은 순환 시리즈를 생성하기 위해 재귀 기반 프로그램 / 함수를 만드는 것입니다. 강도는 강도 스레드 에서 더 짧은 비 재귀 솔루션을 시도 합니다 .

도전 시놉시스

많은 언어에서 재귀 함수는 프로그래밍 작업을 크게 단순화 할 수 있습니다. 그러나 올바른 재귀에 대한 구문 오버 헤드는 코드 골프에서의 유용성을 제한 할 수 있습니다.

경찰 단일 정수 복용 프로그램이나 함수를 생성한다 n처음 생성되며 n, 정수 된 일련의 항목 만 이용 재귀 1 . 또한 엔트리를 안전한 것으로 표시하기 위해 시퀀스를 생성하는 짧은 비재 귀적 방법이 있는지 확인해야합니다.

강도는 찾기 위해 노력할 것입니다 짧은 , 같은 정수 시리즈를 생성, 동일한 언어로 프로그램이나 기능을 더 재귀 사용하지 않고 2 .

경찰의 제출이 10 일 (240 시간) 내에 크랙되지 않으면 경찰은 자신의 솔루션을 공개함으로써 더 짧은 비재 귀적 접근이 가능하다는 것을 실제로 증명할 것입니다. 그런 다음 제출물을 안전하다고 표시 할 수 있습니다 .

경찰 도전의 승자는 안전하다고 표시된 가장 짧은 ( 에 따른 ) 재귀 기반 제출이 될 것입니다.

강도 도전의 승자는 대부분의 솔루션을 해독 한 강도가 될 것입니다.

1 : 구문에서 재귀 적이어야합니다. 예를 들어 테일 콜 최적화에 대해 걱정할 필요가 없습니다.

2 : 다시, 비 재귀 구문; 따라서 꼬리 호출 최적화 덕분에 재귀 솔루션을 게시하고 루프로 컴파일 할 수 없습니다.

제출 요건

각 제출에는 단일 정수 n(0 또는 1 기준)가 사용됩니다. 제출은 선택한 n정수 시리즈의 첫 번째 항목 을 출력하거나 반환합니다 . 이 정수 계열은에 의존해서는 안됩니다 n. 입력 및 출력 방법은 재귀 적 접근 방식과 비재 귀적 접근 방식간에 다를 수 있습니다. 정수 계열은 길이가 5 이상인 결정적 계열 일 수 있습니다. 계열을 올바르게 설명해야합니다.

귀하의 제출물은 임의의 큰 n일을 할 필요는 없지만 적어도 일을해야합니다 n=5. 비재 귀적 접근 방식은 적어도 n재귀 적 접근 방식 과 동일 하거나 n=2^15-1더 작은 방식 으로 작동 할 수 있어야합니다 .

재귀

이러한 문제를 해결하기 위해 재귀는 자신호출 하는 함수 (또는 함수와 유사한 구문)를 사용하여 원하는 시퀀스를 만드는 것으로 정의됩니다 . 재귀 깊이는 무한대로 가면서 무한대로 가야 합니다. 비 재귀 방법입니다 아무거나 하지 재귀.n


백리향의 경우 for재귀에 의해 수행되는for 재귀 또는 루프입니까?
l4m2

코드가 임의로 작동한다고 말할 수 있습니까? n이론적으로 올바른 경우 하지만 시간이나 메모리 제약으로 인해 코드를 실행할 수 없다고 말할 수 있습니까?
Bubbler

@Bubbler 확실히, 그러나 적어도 n=5 계산되어야합니다
Sanchises

@ l4m2 모든 언어가 경쟁 할 수있는 것은 아닙니다. 이 언어에는 재귀를 사용하지 않는 기본 방법이없는 것 같습니다 (xfor 일부 가져 오기를 통해 사용할 수 있습니까?).이 언어는 경쟁 할 수 없습니다.
Sanchises

n이 커질 때 그렇게 많이 가지 않는 재귀는 재귀입니까?
l4m2

답변:


4

Python 3 , 65 바이트 (안전)

f=lambda n,a=3,b=0,c=6,d=6:n*[1]and[a+b]+f(n-1,c,d,2*c+d,2*a+3*b)

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

파이썬에서 또 다른 시도.

순서는 "2 색 n 보드를 3 가지 색의 도미노로 채우는 방법의 수이며, 따라서 같은 색의 도미노 2 개가 서로 닿지 않도록합니다." OEIS에는 없습니다.


말해 보자 n=6. 보드는 다음과 같습니다.

######
######

다음은 세 가지 색상의 유효한 도미노 타일링입니다 ( 1-3각 색상을 나타냄).

123123 122331 212332 212121 113311
123123 133221 212112 212121 331133

그러나 이것들은 아닙니다 (동일한 두 개의 도미노가 서로 닿아 있습니다) :

112323 332333 211113
112323 112311 233223

이 시퀀스는 각 규칙을 만족하는 모든 가능한 도미노 타일링을 계산합니다 n.


의도 된 솔루션, 58 바이트

n=int(input());a=3;b=12
for _ in[0]*n:print(a);a,b=b,a*4+b

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

불행히도 재귀 코드에 명확하게 표시된 재발 관계를 단순화하기 위해 아무도 신경 쓰지 않는 것처럼 보입니다. 주어진 이중 반복으로 프로그램을 만드는 것은 파이썬 3부터 작동하지 않습니다.


1
시퀀스에 대해 더 자세히 설명해 주시겠습니까?
tsh

@tsh 설명이 추가되었습니다. 더 나아 보이나요?
Bubbler

2

l4m2에 의해 갈라진 47 바이트 옥타브

@(n)(f=@(r,m){@()[r(r,m-1),m],[]}{~m+1}())(f,n)

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

예를 들어, 다음은 첫 번째 n양의 정수 https://oeis.org/A000027 을 생성하는 Octave 항목입니다 .


금이 . 재귀 익명 함수를 만드는 데 +1하지만 ... 자주 사용되지는 않습니다 :)
Stewie Griffin

@StewieGriffin 나는 루프 기반 버전보다 결코 짧지 않지만 옥타브에서 골프 재귀 익명 함수를 절대적으로 좋아합니다. 이 도전의 반대는 분명히 옥타브에서 경찰에게 도전이 될 입니다.
Sanchises

@StewieGriffin 채팅의 핑이 작동했는지 확실하지 않지만 l4m2, 당신을 이길 수 있습니다.
Sanchises

2

Python 3 , 75 바이트, xnor 크랙

f=lambda n,a=[1]:a*n and[a[0]]+f(n-1,sorted({*a[1:],a[0]*2,a[0]*3,a[0]*5}))

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

유명한 해밍 숫자, 일명 5 부드러운 숫자 ( A051037) ).

깨진 솔루션, 51 바이트

lambda n:[k for k in range(1,2**n)if 60**k%k<1][:n]

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

의도 된 솔루션, 74 바이트

lambda n:sorted(2**(i%n)*3**(i//n%n)*5**(i//n**2)for i in range(n**3))[:n]

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



2

NieDzejkob에 의해 크랙 된 Forth (gforth) , 39 바이트

: | dup 1 > if dup 1 - recurse then . ;

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


1
와 다른 정수 시리즈가 허용됩니다. [1,2,...,n]맞습니까?
Sanchises


나는 균열이 구글을 사용하여 계산 된 루프를 찾기 위해 구글 검색 거리이기 때문에 그것에 대해 생각했다. 그러나 실제로 함수 내부의 모든 것을 어쨌든 루프 내부에서 쉽게 다시 만들 수 있습니다.
jmarkmurphy

2

로다 , 40 바이트

f x,a=1,b=2{[a];f x-1,a=b,b=a+b if[x>1]}

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

이 함수는 다음과 같은 유한 시퀀스 (첫 번째 피보나치 수 90 개)를 제공합니다.

1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
2971215073
4807526976
7778742049
12586269025
20365011074
32951280099
53316291173
86267571272
139583862445
225851433717
365435296162
591286729879
956722026041
1548008755920
2504730781961
4052739537881
6557470319842
10610209857723
17167680177565
27777890035288
44945570212853
72723460248141
117669030460994
190392490709135
308061521170129
498454011879264
806515533049393
1304969544928657
2111485077978050
3416454622906707
5527939700884757
8944394323791464
14472334024676221
23416728348467685
37889062373143906
61305790721611591
99194853094755497
160500643816367088
259695496911122585
420196140727489673
679891637638612258
1100087778366101931
1779979416004714189
2880067194370816120
4660046610375530309

나는 그것이 더 많은 피보나치 수를 생성 할 수 있다는 것을 알고 있지만,이 도전의 목적을 위해이 수를 생성하기에 충분합니다.


1

JavaScript (Node.js) , 91 바이트, Cracked by l4m2

f=x=>[w=~-x&&(g=(n,y=2)=>~-n&&(n<y?1:n%y?g(n,y+1):1+g(n/y,y)))(x)+f(x-1),console.log(w)][0]

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

OEIS 시퀀스 A022559 의 첫 n 개 항을 인쇄합니다 (i = 1부터 시작).

l4m2는 3 for 루프를 74 72 바이트 로 맞추고 내 경찰 게시물을 해독했습니다.

n=>{for(i=s=0;j=i++<n;console.log(s))for(x=i;j++<i;)for(;x%j<1;x/=j)s++}

그러나 의도 된 답변에는 실제로 2 개의 for 루프 만 있습니다.

n=>{for(i=c=0;i++<n;console.log(c))for(p=2,z=i;p<=z;z%p?p++:(z/=p,c++));}

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



@ l4m2 실제로 73 바이트를 가지고 있습니다.) 어쨌든
축하합니다

골프 선수로 가십시오. 이제 72 명 @ user71546
l4m2

1

NieDzejkob에 의해 크랙 된 x86 .COM 함수, 12 바이트

0000 52                     push dx
0001 4A                     dec dx
0002 7403                   je 0007
0004 E8F9FF                 call 0000
0007 58                     pop ax
0008 F7E0                   mul ax
000A AB                     stosw


000B C3                     ret

입력 DX, 출력 [DI] ~ [DI + 2 * DX-1]

크래커의 해결책 :

0: 31 C0    xor ax, ax
2: BF 01 00 mov di, 1
5: 01 F8    add ax, di
7: AB       stosw
8: E2 FB    loop 5
A: C3       ret

의도 된 솔루션 :

  xor bx,bx
c:inc bx
  mov ax,bx
  mul ax
  stosw
  loop c
  ret


출력 방법을 변경했습니다. 당신은 볼 수 있습니까?
NieDzejkob

1

파이썬 3 , 62 바이트, mwchase에 의해

def f(x):
 if(x<1):return[1]
 return f(x-1)+[sum(f(x-1)[-2:])]

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

나는 이것이 너무 쉬울 것 같은 느낌이 든다 ...

시퀀스는 피보나치 시퀀스 f(n) = f(n-1) + f(n-2)입니다f(0) = f(1) = 1


부울 연산자로 만든 인라인 삼항 명령문으로 전환하여 하나의 명령문에 넣은 다음 콜론 바로 다음에 갈 수 있습니다. 최소한 8 바이트를 저장합니다.
mwchase

람다로 전환하면 2 개 (EDIT : 4)가 더 절약됩니다.
mwchase

2
@ mwchase 귀하의 제안에 감사하고 향후 파이썬 코드 골프 제출에 대해 염두에 두어야하지만 몇 가지 이유로 경찰과 강도 제출을하지 않을 것입니다. 먼저 골프를 계속하면 강도에 대한 이동 목표를 설정합니다.이 유형의 게시물에는 바람직하지 않습니다. 두 번째로 골프를
타는


1

mbomb007에 의해 크랙 되는 Gol> <> , 15 바이트

I1AZZ;
M:K:?ZNB

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

시리즈는 0,1,2,3,4,5있지만 각 요소 뒤에는 많은 0이 있습니다.

예를 들어 처음 몇 값은 다음과 같습니다.

 1: 0  First element, followed by 0 zeroes
 2: 1  Followed by 1 zero
 3: 0
 4: 2  Followed by 2 zeroes
 5: 0
 6: 0
 7: 3  Followed by 3 zeroes
 8: 0
 9: 0
10: 0
    etc.



0

Windows .BAT, 80 바이트

@set /a n=%1-1
@echo 8%3
@if 0 neq %n% @call %0 %n% 2%3 6%2%3

용법:

CD <PATH>
<FILENAME> <N_1>
<FILENAME> <N_2>
<FILENAME> <N_3>

루프 버전은 현재 사전에서 가정 할 수 있지만 초기화하거나 재설정해야합니다.


0

파이썬, 82 바이트; 깨진

이것은 82 바이트 의 OEIS 시퀀스 A004001 의 재귀적인 Python 구현입니다 . 이 시리즈에 대한 더 많은 배경은 Wolfram 's Mathworld 에서 찾을 수 있습니다 .

def A(n):
 if n in[1,2]:return[1]*n
 S=A(n-1);return S+[S[S[n-2]-1]+S[n-S[n-2]-1]]

이 순서에서 처음 30 개의 숫자는 다음과 같습니다.

1, 1, 2, 2, 3, 4, 4, 4, 5, 6, 7, 7, 8, 8, 8, 8, 9, 10, 11, 12, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16

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