เมื่อฟีโบนักชีพบราชินี


18

(แรงบันดาลใจจากคำตอบของ Helka ต่อการจับคู่แท็ก "หมากรุก" และ "Fibonacci" แบบสุ่มในการแชท)


fibonacci

ตัวเลข Fibonacciเป็นหนึ่งในลำดับที่รู้จักกันดีในวิชาคณิตศาสตร์ที่แต่ละหมายเลขจะประกอบด้วยโดยการเพิ่มตัวเลขสองก่อนหน้านี้ร่วมกัน ด้านล่างนี้เป็นคำจำกัดความของลำดับศูนย์ดัชนี:

f(0) = 0
f(1) = 1
f(n) = f(n-1) + f(n-2)

ซึ่งจะส่งผลในลำดับ0, 1, 1, 2, 3, 5, 8, 13, 21, ...( ลิงค์ OEIS ) ในความท้าทายนี้เราจะมุ่งเน้นเฉพาะค่าบวกอย่างเคร่งครัด (ดังนั้น1, 1, 2, 3, ...) และคุณสามารถเลือกการจัดทำดัชนีเป็นศูนย์หรือการจัดทำดัชนีเดียว แต่โปรดระบุสิ่งที่คุณส่งมา

หมายเลข Fibonacci สามารถใช้สำหรับการเรียงตัวของระนาบโดยใช้กำลังสองที่ต่อเนื่องกันf(n)ในขนาดและจัดตำแหน่งขอบเข้าด้วยกัน การเรียงกระเบื้องทำในลักษณะทวนเข็มนาฬิกาโดยวางสี่เหลี่ยมในรูปแบบ "ขวาขึ้น - ซ้าย - ลง" จากตารางปัจจุบัน ตัวอย่างของการเรียงต่อกันบางส่วนสำหรับที่f(8)=21มีตารางเริ่มต้นเน้นด้วยสีฟ้ามีดังนี้:
Fibonacci Squares

ท่านสามารถเข้าดูf(1)=1เป็นตารางเริ่มต้น (ไฮไลท์สีฟ้า) ที่f(2)=1ตารางวางไปทางขวาของมันf(3)=2ตารางวางขึ้นจากที่นั่นที่f(4)=3ตารางวางซ้ายและอื่น ๆ สี่เหลี่ยมต่อไปจะเป็นf(9)=21+13=34และจะถูกวางไว้ที่ด้านล่าง นี่เป็นวิธีการเรียงไฟล์บางส่วนที่เราจะใช้ในการท้าทายนี้


ราชินี

ในเกมหมากรุกชิ้นส่วนที่ทรงพลังที่สุดคือราชินีเพราะสามารถเคลื่อนย้ายช่องว่างจำนวนเท่าใดก็ได้ทั้งแนวนอนแนวตั้งหรือแนวทแยงมุม ในแผนภาพด้านล่างบอร์ดสี่เหลี่ยมที่มีวงกลมสีดำแสดงตำแหน่งที่ราชินีสามารถเคลื่อนที่ได้:
สมเด็จพระราชินีเคลื่อนไหวในหมากรุก

เราจะกำหนดคำครอบคลุมเป็น

เปอร์เซ็นต์ของช่องสี่เหลี่ยมที่ราชินีสามารถเลื่อนไปเทียบกับจำนวนช่องสี่เหลี่ยมทั้งหมดได้รับตำแหน่งเฉพาะของราชินีบนกระดานเปล่าและรวมถึงตำแหน่งเริ่มต้นของราชินี

28/64 = 43.75%สำหรับการย้ายตัวอย่างข้างต้นความคุ้มครองของพระราชินีเป็น ถ้าราชินีอยู่ในh8ตารางด้านบนขวาความคุ้มครองก็จะเป็น22/64 = 34.375%เช่นนั้น ถ้าพระราชินีอยู่ในความคุ้มครองจะเป็นe724/64 = 37.5%


ความท้าทาย

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

  • nแสดงให้เห็นถึงวิธีการปูกระเบื้องขนาดใหญ่คือ ตัวอย่างการเรียงต่อกันด้านบนโดยที่ช่อง21สี่เหลี่ยมด้านซ้ายเป็นบอร์ดขนาดn = 8ตั้งแต่f(8) = 21(เมื่อไม่มีดัชนี)
  • xหมายถึงซึ่งสี่เหลี่ยม Fibonacci ใช้สำหรับพระราชินี (s) ตำแหน่งสำหรับการคำนวณความคุ้มครอง ราชินีถูกวางครั้งเดียวในแต่ละตารางในกระเบื้องสี่เหลี่ยม Fibonacci นั้นและความครอบคลุมโดยรวมคือผลรวมของความครอบคลุมของแต่ละบุคคล (ไม่ซ้ำกัน)

ตัวอย่างเช่นที่นี่เป็นภาพของn = 8(ปูกระเบื้องเดียวกันกับด้านบน) และx = 4(ตรงกับf(4) = 3สี่เหลี่ยมสีน้ำเงินเทา) โดยการวางราชินีหนึ่งครั้งในแต่ละช่องสี่เหลี่ยมสีน้ำเงินทั้งเก้านี้ราชินีสามารถ (รวมกัน) ครอบคลุมทุกสี่เหลี่ยมจัตุรัสที่มีสีส้ม 309/714 = 43.28%ความคุ้มครองรวมในตัวอย่างนี้จึงเป็น

n = 8, x = 4

เห็นได้ชัดว่าทุกเวลาที่n = xความครอบคลุมจะเป็น100%(ตัวอย่างเช่นด้วยn=8และx=8คุณจะเห็นได้ว่าทุกตารางในกระดานทั้งหมดจะครอบคลุมอย่างน้อยหนึ่งครั้ง) ในทางกลับกันด้วยขนาดที่ใหญ่พอสมควรnและx=1หรือx=2ความครอบคลุมจะเข้าใกล้ (แต่ไม่ถึง) 0%(ตัวอย่างเช่นด้วยn=8และx=1ความครอบคลุมเป็นเรื่องเล็ก88/714 = 12.32%)

เมื่อป้อนหมายเลขดังกล่าวสองหมายเลขคุณต้องส่งออกเปอร์เซ็นต์ความครอบคลุมแม่นยำเป็นทศนิยมสองตำแหน่ง โปรดระบุวิธีที่รหัสของคุณจัดการการปัดเศษ


กฎระเบียบ

  • อินพุตและเอาต์พุตสามารถกำหนดได้ในรูปแบบที่สะดวกแต่ต้องมีความถูกต้องกับทศนิยมสองตำแหน่ง โปรดระบุวิธีที่รหัสของคุณจัดการการปัดเศษ
  • สมมติว่าไม่มีชิ้นส่วนอื่น ๆ อยู่บนกระดานหรือขัดขวางการเคลื่อนไหว
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • หากเป็นไปได้โปรดใส่ลิงค์ไปยังสภาพแวดล้อมการทดสอบออนไลน์เพื่อให้ผู้อื่นสามารถลองใช้รหัสของคุณได้!
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

ตัวอย่าง

n = 8, x = 4
43.28

n = 8, x = 8
100 or 100.00

n = 8, x = 1
12.32

n = 4, x = 1
66.67

n = 4, x = 2
60 or 60.00

n = 5, x = 3
75 or 75.00

n = 5, x = 1
47.5 or 47.50

รูปโปรไฟล์ของฉันเกี่ยวข้องกึ่ง
Stephen

"เมื่อ Fibonacci พบควีนส์"? หรือ "ฟีโบนักชีพบราชินี"?
Jonathan Allan


@JonathanAllan ชื่อถูกต้องตามที่เป็นอยู่ มันแสดงให้เห็นถึงกาลเวลาใน "นี่คือสิ่งที่เกิดขึ้นเมื่อ X เกิดขึ้น" เปรียบเทียบ "เมื่อเฮนรี่มาพบกับแซลลี่เพื่อรับประทานอาหารกลางวันพวกเขามักจะกินแฮมเบอร์เกอร์"
AdmBorkBork

อ่าคุณหมายถึง "เมื่อฟีโบนักชีพบราชินี ... "!
Jonathan Allan

คำตอบ:


2

VB.NET, (.NET 4.5), 1238 1229 ไบต์

-9 ไบต์ขอบคุณ @tallynhuman

Function A(n,x)
Dim g=New List(Of List(Of Long))
g.Add(New List(Of Long))
g(0).Add(1)
For i=2To n
Dim b=1
If i>2Then 
Dim w=0,y=1
b=w+y
For j=3To i
w=y
y=b
b=w+y
Next
End If
Select Case i Mod 4
Case 1
For j=1To b
Dim l=New List(Of Long)
For k=1To b
l.Add(i)
Next
g.Add(l)
Next
Case 2
For Each r In g
For j=1To b
r.Add(i)
Next
Next
Case 3
For j=1To b
g.Insert(0,New List(Of Long))
For k=1To b
g(0).Add(i)
Next
Next
Case 0
For Each r In g
For j=1To b
r.Insert(0,i)
Next
Next
End Select
Next
For i=0To g.Count-1
Dim c=g(i)
For j=0To c.Count-1
Dim e=c(j)
If e=x Then
For k=1To Math.Max(g.Count,g(0).Count)
If j-k>=0AndAlso c(j-k)<>x Then c(j-k)=0
If i-k>=0AndAlso g(i-k)(j)<>x Then g(i-k)(j)=0
If j+k<c.Count AndAlso c(j+k)<>x Then c(j+k)=0
If i+k<g.Count AndAlso g(i+k)(j)<>x Then g(i+k)(j)=0
If i-k>=0AndAlso j-k>=0AndAlso g(i-k)(j-k)<>x Then g(i-k)(j-k)=0
If i-k>=0AndAlso j+k<c.Count AndAlso g(i-k)(j+k)<>x Then g(i-k)(j+k)=0
If i+k<g.Count AndAlso j-k>=0AndAlso g(i+k)(j-k)<>x Then g(i+k)(j-k)=0
If i+k<g.Count AndAlso j+k<c.Count AndAlso g(i+k)(j+k)<>x Then g(i+k)(j+k)=0
Next
End If
Next
Next
Dim hits=0
For Each r In g
For Each c In r
If c=x Or c=0Then hits+=1
Next
Next
Return Math.Round(hits*100/(g.Count*g(0).Count),2)
End Function

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

จากนั้นฉันพบทุกเซลล์ที่ควรมีราชินีอยู่ในนั้นและทำเครื่องหมายช่องสี่เหลี่ยมที่ถูกคุกคามแต่ละช่องด้วยศูนย์ ฉันข้ามเซลล์ที่มีราชินีเพื่อฉันไม่ต้องกังวลกับการย้อนรอย

ในตอนท้ายฉันนับจำนวนเซลล์ที่ถูกล้างและเซลล์ที่มีควีนส์แล้วหารด้วยจำนวนช่องว่างทั้งหมด คูณด้วย 100 เพื่อให้ได้เปอร์เซ็นต์และปัดเศษเป็นทศนิยมสองตำแหน่งที่ใกล้ที่สุด


คุณไม่สามารถเปลี่ยนhitsชื่อตัวแปรที่สั้นกว่านี้ได้หรือไม่? ฉันไม่รู้จัก VB.NET แต่ฉันคิดว่ามันเป็นตัวแปร
มนุษย์

@Totallyhuman yep ถูกต้องแล้ว ฉันผ่านไปด้วยมือและต้องพลาดสิ่งนั้น ขอบคุณ!
Brian J

2

Python 2 , 524 499 ไบต์

def Q(n,x):
 global w,h,f;f,R,L=0,range,len
 for d in R(n):s=x-1==d;f=f or[[s]];w=L(f[0]);W,H=R(w),R(L(f));exec"for j in "+("W:f.append([s]*w)","f:\n\tfor k in H:j.append(s)","W:f.insert(0,[s]*w)","f:\n\tfor k in H:j.insert(0,s)","f:0")[d%4-(d==0)]
 w,h=L(f[0]),L(f);l=0,1,-1
 for Y in R(h):
	for X in R(w):exec("""def F(u,v,x,y):
 while(u==v==0)==0<=x<w!=0<=y<h:f[y][x]=1+(f[y][x]!=1);x+=u;y+=v
for s in l:
 for t in l:F(s,t,X,Y)""","")[f[Y][X]!=1]
 q=w*h;return(q-sum(j.count(0)for j in f))*100./q

ลองออนไลน์!

กำหนดฟังก์ชั่นที่ใช้ในขนาดการปูกระเบื้องที่และจำนวนตารางสมเด็จพระราชินีฯn fibonacci xเปอร์เซ็นต์ ouput จะถูกปัดเศษเป็นทศนิยมสองตำแหน่ง (ในส่วนท้ายที่มีการส่งออกทั้งหมด)

f0เป็นอาร์เรย์สองมิติที่มีข้อมูลของคณะกรรมการที่มีการริเริ่ม จากนั้นกระดานหมากรุก fibonacci จะถูกคำนวณและบรรจุด้วยราชินีที่ซึ่งราชินีจะเป็น ราชินีเหล่านั้นจะถูกย้ายไปทุกที่ที่สามารถเคลื่อนย้ายได้ ตำแหน่งทั้งหมดจะถูกนับและพิมพ์เป็นเปอร์เซ็นต์ของบอร์ดทั้งหมด


1

Mathematica 11.1, 336 bytes, 1-based

R=Rectangle[#,+##]&;f=Fibonacci;o=Join@@Outer[##,1]&;r=RegionUnion;s=RegionMeasure;p[1]={0,0};p[i_]:=p[i-1]+{{-f@i,-f[i-2]},{0,-f@i},{f[i-1],0},{f[i-1]-f@i,f[i-1]}}[[i~Mod~4+1]];t[i_]:=r[R[p@#,f@#]&/@Range@i];k[n_,x_]:=Round[100s@RegionIntersection[r[R[#,f@x]&/@((#+p@x)&/@o[1##&,o[List,{-1,0,1},{-1,0,1}],Range[2f@n]])],t@i]/s@t@i,.01]

การใช้งาน: k[n, x]. ให้ความสนใจว่าฟังก์ชั่นนี้เป็นพื้นฐาน 1 การปัดเศษทำได้โดยRound[100x,0.01]

โดยทั่วไปp[i]ฟังก์ชั่นการกำหนดตำแหน่งของแต่ละตาราง และพื้นที่ที่มีการคำนวณโดยระดับบนการทำงานเช่นRegionIntersection, RegionUnion,RegionMeasure

ผลลัพธ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.