Khi Fibonacci gặp Nữ hoàng


18

(lấy cảm hứng từ phản ứng của Helka đối với việc ghép các thẻ "cờ" và "Fibonacci" ngẫu nhiên của tôi trong trò chuyện)


Các số Fibonacci là một trong những chuỗi được biết đến nhiều hơn trong toán học, trong đó mỗi số được tạo bằng cách cộng hai số trước đó lại với nhau. Dưới đây là định nghĩa của chuỗi không có chỉ mục:

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

Điều này dẫn đến trình tự 0, 1, 1, 2, 3, 5, 8, 13, 21, ...( liên kết OEIS ). Trong thử thách này, chúng tôi sẽ chỉ tập trung vào các giá trị cực kỳ tích cực (vì vậy 1, 1, 2, 3, ...) và bạn có thể chọn lập chỉ mục bằng 0 hoặc lập chỉ mục một, nhưng vui lòng nêu rõ trong bài gửi của bạn.

Các số Fibonacci có thể được sử dụng để ốp lát mặt phẳng, bằng cách sử dụng các hình vuông có f(n)kích thước kế tiếp nhau và sắp xếp các cạnh của chúng với nhau. Việc ốp lát được thực hiện theo kiểu ngược chiều kim đồng hồ, bằng cách đặt các ô vuông theo mẫu "phải lên trên trái" từ hình vuông hiện tại. Một ví dụ về ốp lát một phần này f(8)=21, với hình vuông bắt đầu được tô màu xanh lam, như sau:
Hình vuông Fibonacci

Bạn có thể thấy f(1)=1hình vuông bắt đầu (được tô màu xanh lam), f(2)=1hình vuông được đặt bên phải của nó, f(3)=2hình vuông được đặt lên từ đó, f(4)=3hình vuông được đặt bên trái và cứ thế. Hình vuông tiếp theo sẽ f(9)=21+13=34và sẽ được đặt xuống dưới cùng. Đây là phương pháp ốp lát một phần chúng ta sẽ sử dụng trong thử thách này.


Nữ hoàng

Trong trò chơi cờ vua , quân cờ mạnh nhất là nữ hoàng vì nó có thể di chuyển bất kỳ số lượng không gian theo chiều ngang, chiều dọc hoặc đường chéo. Trong sơ đồ bảng dưới đây, các ô vuông có hình tròn màu đen hiển thị nơi nữ hoàng có thể di chuyển:
Nữ hoàng di chuyển trong cờ vua

Chúng tôi sẽ xác định phạm vi bảo hiểm

Tỷ lệ phần trăm hình vuông mà nữ hoàng có thể di chuyển so với tổng số hình vuông, được đặt vị trí cụ thể của nữ hoàng trên một bảng trống, và bao gồm cả vị trí bắt đầu của nữ hoàng.

Đối với ví dụ di chuyển ở trên, phạm vi bảo hiểm của nữ hoàng là 28/64 = 43.75%. Nếu nữ hoàng ở quảng trường phía trên bên phải h8, phạm vi bảo hiểm sẽ là 22/64 = 34.375%. Nếu nữ hoàng ở trong e7, phạm vi bảo hiểm sẽ là 24/64 = 37.5%.


Các thách thức

Chúng tôi sẽ sử dụng ốp lát Fibonacci được trình bày ở trên làm bàn cờ của chúng tôi cho thử thách này. Bạn sẽ được cung cấp hai số nguyên dương làm đầu vào nx:

  • Các nđại diện cho mức độ lớn của ốp lát. Ví dụ ốp lát ở trên, với 21hình vuông bên trái, là một bảng có kích thước n = 8kể từ f(8) = 21(khi được lập chỉ mục bằng 0).
  • Đại xdiện cho hình vuông Fibonacci nào được sử dụng cho vị trí nữ hoàng, để tính toán phạm vi bảo hiểm. Các kiến ​​trúc được đặt một lần một lần trên mỗi ô vuông trong ô vuông Fibonacci cụ thể đó và tổng độ bao phủ là tổng của phạm vi bảo hiểm (duy nhất).

Ví dụ, đây là một hình ảnh của n = 8(cùng một lát như trên) và x = 4(tương ứng với f(4) = 3hình vuông, màu xanh lam). Bằng cách đặt một nữ hoàng một lần vào mỗi trong số chín ô vuông màu xanh đó, các nữ hoàng có thể (kết hợp) bao phủ mọi ô vuông có màu cam. Do đó, tổng bảo hiểm trong ví dụ này là 309/714 = 43.28%.

n = 8, x = 4

Rõ ràng, bất cứ lúc nào n = x, phạm vi bảo hiểm sẽ diễn ra 100%(ví dụ, với n=8x=8, bạn có thể thấy rằng mọi ô vuông trên toàn bộ bảng sẽ được phủ ít nhất một lần). Ngược lại, với độ lớn phù hợp nx=1hoặc x=2, phạm vi bảo hiểm sẽ tiếp cận (nhưng không bao giờ đạt được) 0%(ví dụ, với n=8x=1, phạm vi bảo hiểm là rất nhỏ 88/714 = 12.32%).

Cho hai số đầu vào như vậy, bạn phải xuất tỷ lệ phần trăm bảo hiểm, chính xác đến hai chữ số thập phân. Vui lòng xác định cách mã của bạn xử lý làm tròn.


Quy tắc

  • Đầu vào và đầu ra có thể được cung cấp ở bất kỳ định dạng thuận tiện nào , nhưng phải chính xác đến hai chữ số thập phân. Vui lòng xác định cách mã của bạn xử lý làm tròn.
  • Giả sử không có mảnh nào khác trên bảng hoặc can thiệp vào việc di chuyển.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Nếu có thể, vui lòng bao gồm một liên kết đến một môi trường thử nghiệm trực tuyến để người khác có thể thử mã của bạn!
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Ví dụ

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

Ảnh đại diện của tôi có liên quan
Stephen

"Khi Fibonacci gặp Nữ hoàng"? Hoặc "Fibonacci đáp ứng các nữ hoàng"?
Jonathan Allan


@Jonathan ALLan Tiêu đề đúng như nguyên trạng. Đó là hiện tại chỉ định như trong "đây là những gì xảy ra khi X xảy ra." So sánh "Khi Henry gặp Sally cho bữa trưa, họ luôn ăn hamburger."
admBorkBork

À, ý bạn là "Khi Fibonacci gặp Nữ hoàng ..."!
Jonathan Allan

Câu trả lời:


2

VB.NET, (.NET 4.5), 1238 1229 byte

-9 byte nhờ @totallyhuman

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

Mô phỏng báo cáo vấn đề. Tôi bắt đầu bằng cách tạo lưới, lặp qua từng số Wikipedia mới để tăng kích thước hình vuông. Tôi lưu trữ chỉ mục trong mỗi ô, để dễ dàng tìm thấy nơi các nữ hoàng sẽ đi trong bước tiếp theo.

Sau đó, tôi tìm thấy mọi tế bào nên có một nữ hoàng trong đó, và đánh dấu mỗi ô vuông bị đe dọa bằng một số không. Tôi bỏ qua các tế bào nơi các nữ hoàng ở đó để tôi không phải lo lắng về việc quay lại.

Cuối cùng, tôi đếm các ô bị xóa và các ô có kiến ​​trúc, rồi chia nó cho tổng số khoảng trắng. Nhân với 100 để có được tỷ lệ phần trăm và làm tròn đến hai vị trí thập phân gần nhất.


Bạn có thể không thay đổi hitsthành một tên biến ngắn hơn? Tôi không biết VB.NET, nhưng tôi cho rằng đó là một biến.
hoàn toàn là

@totallyhuman yep, đúng vậy. Tôi đã đi qua bằng tay và phải bỏ lỡ điều đó. Cảm ơn!
Brian J

2

Python 2 , 524 499 byte

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

Hãy thử trực tuyến!

Xác định một hàm có cả kích thước ốp lát nvà số vuông của Nữ hoàng x. Tỷ lệ phần trăm ouput được làm tròn đến hai chữ số thập phân (ở chân trang, nơi tất cả đầu ra đang diễn ra).

flà một mảng hai chiều chứa thông tin bảng được bắt đầu 0. Sau đó, bàn cờ của trò chơi được tính toán và điền vào các nữ hoàng nơi các nữ hoàng sẽ ở đó. Những nữ hoàng sau đó được chuyển đến mọi nơi họ có thể được di chuyển; tất cả các vị trí được tính và in theo tỷ lệ phần trăm của toàn bộ bảng.


1

Mathicala 11.1, 336 byte, dựa trên 1

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]

Cách sử dụng : k[n, x]. Hãy chú ý rằng chức năng là dựa trên 1. Làm tròn đượcRound[100x,0.01]

Về cơ bản, p[i]là một chức năng xác định vị trí của mỗi hình vuông. Và diện tích được tính bằng cách thượng cấp các chức năng như RegionIntersection, RegionUnion,RegionMeasure

kết quả

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.