この課題は再帰(警官のスレッド)に関するものです


15

警官のスレッド

このスレッドでのタスクは、再帰ベースのプログラム/関数を作成して整数系列を生成することです。強盗は、強盗のスレッドでより短い非再帰的な解決策を見つけようとします。

チャレンジの概要

多くの言語では、再帰関数はプログラミングタスクを大幅に簡素化できます。ただし、適切な再帰の構文オーバーヘッドにより、コードゴルフでの使いやすさが制限される場合があります。

COPSは、単一の整数服用プログラムや関数作成するn最初の生成され、n整数系列のエントリをのみ再帰使用1。また、エントリを安全としてマークするために、シーケンスを生成する短い非再帰的な方法があることを確認する必要があります。

強盗は見つけようとします短く、同じ整数シリーズを生成し、同じ言語でプログラムまたは機能を一切再帰使用していない2

警察官の提出物が10日(240時間)以内にクラックされない場合、警察官は独自の解決策を明らかにすることにより、より短い非再帰的アプローチが実際に可能であったことを証明します。その後、提出物を安全とマークすることがあります

copsチャレンジの勝者は、安全とマークされた最短の(よる)再帰ベースのサブミッションです。

強盗チャレンジの勝者は、ほとんどのソリューションをクラックした強盗です。

1:構文が再帰的であれば十分です。テールコールの最適化などを心配する必要はありません。

2:繰り返しますが、構文は非再帰的です。そのため、末尾呼び出しの最適化のおかげで、再帰的なソリューションを投稿し、ループにコンパイルされたと主張することはできません。

提出要件

各提出には、単一の整数n(ゼロベースまたは1ベース)が必要です。送信するとn、選択した整数シリーズの最初のエントリが出力または返されます。(この整数系列はに依存してはならないことに注意してくださいn)。入力方法と出力方法は、再帰的アプローチと非再帰的アプローチで異なる場合があります。整数シリーズは、長さが5以上の任意の確定的シリーズです。シリーズは適切に説明する必要があります。

あなたの提出は任意の大規模nで働く必要はありませんが、少なくとも働くはずn=5です。非再帰的アプローチは、少なくともn再帰的アプローチと同じか、最大でn=2^15-1、どちらか小さい方まで機能する必要があります。

再帰

この課題のために、再帰は、それ自体呼び出す関数(または関数に似た構造)を使用して目的のシーケンスを作成することとして定義されます(または、それ自体呼び出すことになる関数のシーケンスを呼び出します。これには、Yコンビネーターのような構造が含まれます)。再帰の深さは、無限大になるnにつれて無限大になるはずです。非再帰的アプローチは、再帰的ではないものです。


タイムの場合 for背後で再帰によって行われる、for再帰またはループですか?
l4m2

コードが任意の大きさで機能すると言うことができますか n理論的には正しいが、時間やメモリの制約のために実行できない場合ますか?
バブラー

@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)

オンラインでお試しください!

Pythonでの別の試み。

シーケンスは、「2 x nボードを3色のドミノで塗りつぶし、同じ色の2つのドミノが互いに触れないようにする方法」です。OEISではありません。


言ってみようn=6。ボードは次のようになります。

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

これらは、3色の有効なドミノタイルです(1-3それぞれの色を表します)。

123123 122331 212332 212121 113311
123123 133221 212112 212121 331133

ただし、これらは同じではありません(同じ色の2つのドミノが互いに接触しています)。

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

オンラインでお試しください!

残念ながら、再帰的なコードで明確に示された繰り返し関係を単純化することを誰も気にしていないようです。Python 3であるため、与えられた二重反復をそのまま使用してプログラムを作成することはできません。


1
シーケンスについて詳しく説明してください。
tsh

@tshいくつかの説明を追加しました。良く見えますか?
バブラー

2

オクターブ、47バイト、l4m2クラック

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

オンラインでお試しください!

例として、最初のn正の整数https://oeis.org/A000027を生成するOctaveエントリがあります


割れた。ただし、再帰的な匿名関数を作成するための+1 ...これらはあまり使用されません:)
Stewie Griffin

@StewieGriffin Octaveでは、再帰的な匿名関数が大好きです。ただし、ループベースのバージョンよりも短くなることはありません。この挑戦の逆は、間違いなく警察にとってのオクターブの挑戦です。
-Sanchises

@StewieGriffinちなみに、チャットのpingが機能したかどうかはわかりませんが、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

Forth(gforth)、39バイト、NieDzejkobによりクラック

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

オンラインでお試しください!


1
整数のシリーズとは異なる整数シリーズが許可され[1,2,...,n]ていますか?
-Sanchises


クラックは、forthを使用してカウントされたループを検索するGoogle検索に過ぎないためです。しかし、実際には関数内にあるものはすべて、ループ内で簡単に再作成できます。
-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バイト、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

x86 .COM関数、12バイト、NieDzejkobによりクラック

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

Pythonの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


ブール演算子で作られたインライン3項ステートメントに切り替えることができます。これにより、1つのステートメントに入れられ、コロンの直後に移動できます。少なくとも8バイトを節約します。
mwchase

ラムダに切り替えると、さらに2つ(編集:4つ)節約できます。
mwchase

2
@mwchaseあなたの提案に感謝し、将来のPythonコードゴルフの提出のためにそれらを念頭に置いていますが、私はいくつかの理由で警官と強盗の提出をゴルフしません。最初にゴルフを続けると、強盗の移動目標が設定されますが、このタイプの投稿では望ましくありません。2回目のゴルフでは、反復バージョンもゴルフする必要がありますが、これは同じ程度にはできないかもしれません
-PunPun1000




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

Python、82バイト。割れた

これは、82バイトのOEISシーケンスA004001の再帰的なPython実装です。このシリーズの背景については、Wolframの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.