ความท้าทายนี้เกี่ยวกับการเรียกซ้ำ (เธรดของตำรวจ)


15

ด้ายของตำรวจ

ในเธรดนี้งานของคุณคือสร้างโปรแกรม / ฟังก์ชั่นตามการเรียกซ้ำเพื่อสร้างชุดเลขจำนวนเต็มใด ๆ โจรจะพยายามหาทางออกที่ไม่ใช่ recursive สั้นกว่าในหัวข้อโจร

บทสรุปความท้าทาย

ในหลาย ๆ ภาษาฟังก์ชั่นวนซ้ำสามารถทำให้งานการเขียนโปรแกรมง่ายขึ้นอย่างมาก อย่างไรก็ตามค่าโสหุ้ยไวยากรณ์สำหรับการเรียกซ้ำที่เหมาะสมอาจ จำกัด การใช้งานในโค้ดกอล์ฟ

ตำรวจจะสร้างโปรแกรมหรือฟังก์ชั่นการจำนวนเต็มเดียวnซึ่งจะสร้างเป็นครั้งแรกที่nรายการของชุดจำนวนเต็มโดยใช้เพียงการเรียกซ้ำ 1 พวกเขาควรตรวจสอบให้แน่ใจว่ามีวิธีที่ไม่ใช้เวลาสั้นกว่าในการสร้างลำดับเพื่อทำเครื่องหมายรายการของพวกเขาว่าปลอดภัย

โจรจะพยายามที่จะหาที่สั้นลงโปรแกรมหรือฟังก์ชั่นในภาษาเดียวกันสร้างชุดจำนวนเต็มเดียวกันโดยใช้ไม่มีการเรียกซ้ำ 2

หากการส่งของตำรวจไม่แตกภายในสิบวัน (240 ชั่วโมง) ตำรวจจะพิสูจน์ว่าในความเป็นจริงมีความเป็นไปได้ที่จะมีวิธีการแบบไม่เรียกซ้ำสั้นกว่าโดยเปิดเผยวิธีแก้ปัญหาของตนเอง จากนั้นพวกเขาอาจทำเครื่องหมายการส่งของพวกเขาเป็นที่ปลอดภัย

ผู้ชนะของความท้าทายตำรวจจะสั้นที่สุด (ตาม ) ส่งตาม recursion ที่ทำเครื่องหมายว่าปลอดภัย

ผู้ชนะการแข่งขันจะเป็นโจรที่แก้ปัญหาได้มากที่สุด

1: จำเป็นต้องเรียกซ้ำในไวยากรณ์เท่านั้น คุณไม่จำเป็นต้องกังวลเกี่ยวกับการเพิ่มประสิทธิภาพการโทรหางเช่น

2: อีกครั้งไม่เรียกซ้ำในไวยากรณ์; ดังนั้นคุณจึงไม่สามารถโพสต์โซลูชันแบบเรียกซ้ำและอ้างสิทธิ์การคอมไพล์ไปยังลูปด้วยการเพิ่มประสิทธิภาพการโทรหาง

ข้อกำหนดในการส่ง

การส่งแต่ละครั้งจะใช้จำนวนเต็มเดียวn(เป็นศูนย์หรือหนึ่งฐาน) การส่งจะส่งออกหรือส่งคืนnรายการแรกของชุดตัวเลือกจำนวนเต็ม (โปรดทราบว่าชุดจำนวนเต็มนี้ต้องไม่ขึ้นอยู่กับn) วิธีการอินพุตและเอาต์พุตอาจแตกต่างกันระหว่างวิธีแบบเรียกซ้ำและแบบไม่เรียกซ้ำ ชุดเลขจำนวนเต็มอาจเป็นชุดแบบกำหนดค่าใด ๆ ที่มีความยาวอย่างน้อย 5 ชุดควรอธิบายอย่างถูกต้อง

การส่งของคุณไม่ได้มีการทำงานโดยพลการขนาดใหญ่แต่ควรจะทำงานอย่างน้อยn n=5วิธีที่ไม่ใช่แบบเรียกซ้ำจะต้องสามารถทำงานได้อย่างน้อยเหมือนกับnวิธีแบบเรียกซ้ำหรือn=2^15-1อย่างใดอย่างหนึ่งน้อยกว่า

recursion

เพื่อความท้าทายนี้การเรียกซ้ำถูกกำหนดให้เป็นการสร้างลำดับที่ต้องการโดยใช้ฟังก์ชั่น (หรือฟังก์ชั่นเหมือนโครงสร้าง) ที่เรียกตัวเอง (หรือเรียกลำดับของฟังก์ชั่นที่ลงท้ายด้วยการเรียกตัวเอง; ความลึกของการเรียกซ้ำควรไปที่ไม่มีที่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)

ลองออนไลน์!

ลองอีกครั้งใน Python

ลำดับคือ "จำนวนวิธีในการเติมบอร์ด 2 ต่อ n กับโดมิโนในสามสีเพื่อให้ไม่มีโดมิโนสีเดียวกันสองอันแตะกัน" ไม่ได้อยู่ใน 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

ลองออนไลน์!

น่าเสียดายที่ดูเหมือนว่าไม่มีใครใส่ใจที่จะทำให้ความสัมพันธ์เกิดซ้ำง่ายขึ้นซึ่งแสดงให้เห็นอย่างชัดเจนในรหัสซ้ำ การสร้างโปรแกรมที่มีการเกิดซ้ำซ้ำตามที่กำหนดไม่สามารถทำได้เนื่องจากเป็น Python 3


1
คุณช่วยอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับลำดับได้ไหม
tsh

@tsh เพิ่มคำอธิบายบางอย่าง มันดูดีขึ้นไหม
Bubbler

2

ระดับแปดเสียง 47 ไบต์แตกโดย l4m2

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

ลองออนไลน์!

ในฐานะที่เป็นตัวอย่างนี่คือรายการคู่ซึ่งจะสร้างครั้งแรกnจำนวนเต็มบวกhttps://oeis.org/A000027


Cracked +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}))

ลองออนไลน์!

หมายเลข Hamming ที่มีชื่อเสียงหมายเลขอาคา 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


ฉันคิดถึงเรื่องนั้นเพราะรอยแตกเป็นเพียงการค้นหาโดย Google สำหรับการนับลูปนับใช้ แต่จริงๆสิ่งที่อยู่ภายในฟังก์ชั่นสามารถสร้างขึ้นใหม่ได้อย่างง่ายดายภายในวงอยู่แล้ว
jmarkmurphy

2

Röda , 40 ไบต์

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

ลองออนไลน์!

ฟังก์ชั่นนี้ให้ลำดับลำดับต่อไปนี้ (หมายเลข Fibonacci 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]

ลองออนไลน์!

พิมพ์คำแรก n ของลำดับ OEIS A022559 (เริ่มต้นจาก i = 1)

l4m2 พอดี 3 สำหรับลูปเป็น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 ลูป:

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- ไบต์หนึ่ง) ขอแสดงความยินดีต่อไป
Shieru Asakoto

ไปเล่นกอล์ฟกับผู้ชายตอนนี้ 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

งูหลาม 3 62 ไบต์Crackedโดย 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


คุณสามารถสลับไปยังคำสั่งแบบไตรภาคที่ทำจากตัวดำเนินการบูลีนซึ่งใส่ไว้ในคำสั่งเดียวซึ่งจะไปหลังโคลอนโดยตรง อย่างน้อยแปดไบต์
mwchase

การเปลี่ยนไปใช้แลมบ์ดาช่วยประหยัดสอง (แก้ไข: สี่) มากขึ้น
mwchase

2
@mwchase ในขณะที่ฉันขอขอบคุณข้อเสนอแนะของคุณและจะเก็บไว้ในใจสำหรับการส่งรหัสหลามกอล์ฟในอนาคตฉันจะไม่เล่นกอล์ฟส่งตำรวจและโจรด้วยเหตุผลสองประการ ครั้งแรกถ้าฉันยังคงเล่นกอล์ฟต่อจากนั้นมันจะตั้งเป้าเคลื่อนที่สำหรับโจรซึ่งไม่ต้องการในโพสต์ประเภทนี้ การตีกอล์ฟครั้งที่สองนี้หมายความว่าฉันจะต้องตีกอล์ฟซ้ำของฉันด้วยซึ่งฉันอาจไม่สามารถทำได้ในระดับเดียวกัน
PunPun1000


1

Gol> <> 15 ไบต์แตกโดย mbomb007

I1AZZ;
M:K:?ZNB

ลองออนไลน์!

ในซีรีย์นี้คือ 0,1,2,3,4,5แต่องค์ประกอบแต่ละรายการตามด้วย 0s จำนวนมาก

ตัวอย่างเช่นค่าสองสามค่าแรกคือ:

 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

JavaScript, 63 ไบต์, แคร็ก

f=x=>(x?[f(x-1)[0]&&1?3*f(x-1)[0]+1:f(x-1)[0]/2,...f(x-1)]:[7])

ลองออนไลน์!

ส่งคืนองค์ประกอบ n แรกในอาร์เรย์ที่กลับรายการ



และไม่อนุญาตให้กลับรายการอาร์เรย์ที่กลับรายการในขณะนี้
l4m2

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 ไบต์; Cracked

นี่เป็นการใช้ Python แบบเรียกซ้ำ ลำดับ OEIS A004001ใน 82 ไบต์ พื้นหลังเพิ่มเติมเกี่ยวกับชุดนี้สามารถพบได้ในวุลแฟรมของ 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.