当斐波那契遇见皇后


18

(灵感来自Helka对我在聊天中随机配对“ chess”和“ 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链接)。在此挑战中,我们将仅关注严格的正值(so 1, 1, 2, 3, ...),您可以选择零索引或单索引,但是请在提交时说明。

通过使用f(n)大小连续的正方形并将其边缘对齐在一起,斐波那契数可以用于平铺瓷砖。通过将正方形以当前正方形的“右-上-左-下”样式放置正方形,以逆时针方式进行平铺。的部分平铺示例f(8)=21,其起始正方形用蓝色突出显示如下:
斐波那契广场

您可以看到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%。如果女王进来e7,范围将会是24/64 = 37.5%


挑战

我们将使用上面演示的斐波那契平铺作为此挑战的棋盘。您将获得两个正整数作为输入,nx

  • n代表平铺多大。上面的示例图块21的左侧为正方形,是n = 8自以来的大小f(8) = 21(当索引为零时)。
  • x表示斐波那契数平方用于大号(或多个)的位置,用于计算覆盖范围。将皇后一次放置在该特定斐波那契广场砖上的每个广场上一次,并且总覆盖率是各个(唯一)覆盖率的总和。

例如,这是n = 8(与上面相同的平铺)和x = 4(对应于f(4) = 3正方形,阴影为蓝色)的图像。通过一次将女王放置在这九个蓝色方块中的每个方块中,女王可以(合并)覆盖每个阴影为橙色的方块。因此,本例中的总覆盖范围是309/714 = 43.28%

n = 8,x = 4

很显然,在任何时候n = x,覆盖范围都将是100%(例如,使用n=8x=8,您可以看到整个板上的每个正方形至少要覆盖一次)。相反,具有适当大的nx=1x=2,覆盖将要接近(但从来没有达到)0%(例如,与n=8x=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

我的个人资料图片是半相关的
斯蒂芬

“斐波那契遇见皇后”?还是“斐波那契遇见皇后”?
乔纳森·艾伦


@JonathanAllan标题是正确的。当前的指示时态为“这是X发生时发生的情况”。比较“当亨利和萨利见面吃午餐时,他们总是吃汉堡包。”
AdmBorkBork

啊,你的意思是“当斐波那契遇见皇后……”!
乔纳森·艾伦

Answers:


2

VB.NET(.NET 4.5)1238 1229字节

-9个字节,感谢@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

模拟问题陈述。我首先创建网格,然后遍历每个新的斐波那契数以增加平方大小。我将索引存储在每个单元格中,以便轻松找到下一步的位置。

然后,我找到每个应该有一个女王的单元格,并用零标记每个受威胁的正方形。我跳过了皇后区所在的单元格,因此我不必担心回溯。

最后,我对清除的单元格进行计数,并用女王/王后对单元格进行计数,然后将其除以空格总数。乘以100得到百分比,并四舍五入到最接近的两位小数。


您不能更改hits为较短的变量名吗?我不知道VB.NET,但我假设这是一个变量。
totallyhuman

@totallyhuman是的,没错。我亲手经过,一定错过了那一个。谢谢!
布赖恩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和女王的斐波那契平方数的函数x。输出百分比将大约四舍五入到小数点后两位(在页脚中,所有输出都在该位置)。

f是一个二维数组,其中包含要初始化的板信息0。然后,计算斐波那契棋盘,并在其中放置皇后。然后将那些皇后转移到他们可以移动的每个地方。所有位置均被计算并打印为整个木板的百分比。


1

Mathematica 11.1,336字节,基于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]

用法:k[n, x]。请注意该功能基于1。舍入是通过Round[100x,0.01]

基本上,p[i]是确定每个正方形的位置的功能。和面积由上层功能,如计算RegionIntersectionRegionUnionRegionMeasure

结果

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.