フィボナッチがクイーンズと出会うとき


18

(チャットでの「チェス」タグと「フィボナッチ」タグのランダムな組み合わせに対するヘルカの反応に触発された)


フィボナッチ

フィボナッチ数は、各番号が一緒に前の2つの数字を追加することによって構成されている数学のよりよく知られている配列の一つです。ゼロインデックスシーケンスの定義は次のとおりです。

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, ...)のみに焦点を当てます。インデックス0またはインデックス1を選択できますが、提出する際にそのことを明記してください。

フィボナッチ数は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%


チャレンジ

この課題のチェス盤として、上記のフィボナッチタイリングを使用します。入力として2つの正の整数が与えられ、nさらにx

  • nタイリングがどのように大規模表します。21左の正方形を使用した上記のタイルの例は、(ゼロインデックスの場合)n = 8以降のサイズのボードですf(8) = 21
  • xカバレッジを計算するため、クイーン(S)配置のために使用されるフィボナッチ正方形のどちら表します。クイーンは、その特定のフィボナッチ正方形タイルの各正方形に1つずつ配置され、合計カバレッジは個々の(一意の)カバレッジの合計です。

たとえば、n = 8(上記と同じタイリング)およびx = 4f(4) = 3正方形に対応する、影付きの青)の画像です。これらの9つの青い正方形のそれぞれに1つずつクイーンを配置することにより、クイーンはオレンジ色の網掛けのすべての正方形を(組み合わせて)カバーできます。したがって、この例の合計カバレッジはです309/714 = 43.28%

n = 8、x = 4

明らかにn = x、その範囲はいつでもそうです100%(たとえば、とn=8x=8、ボード全体のすべての正方形が少なくとも1回覆われることがわかります)。逆に、適切な大きさのnand x=1またはx=2で、カバレッジは近づきます(ただし、到達することはありません)0%(たとえば、n=8およびx=1で、カバレッジはわずかです88/714 = 12.32%)。

そのような入力番号が2つある場合、小数点以下2桁までの正確なカバレッジパーセンテージを出力する必要があります。コードが丸めを処理する方法を指定してください。


ルール

  • 入力と出力は任意の便利な形式で指定できますが、小数点以下2桁まで正確でなければなりません。コードが丸めを処理する方法を指定してください。
  • 他の部品がボード上にないか、そうでなければ動きを妨害しないと仮定します。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 可能であれば、他の人があなたのコードを試すことができるように、オンラインテスト環境へのリンクを含めてください!
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

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

ああ、あなたは「フィボナッチがクイーンズと出会うとき...」を意味します!
ジョナサンアラン

回答:


2

VB.NET、(。NET 4.5)、1238 1229バイト

@totallyhumanのおかげで-9バイト

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を掛けてパーセントを取得し、最も近い小数点以下2桁に丸めます。


hits短い変数名に変更することはできませんか?私はVB.NETを知りませんが、それは変数だと仮定しています。
完全に人間

@totallyhumanうん、それは正しい。私は手作業で行ったので、それを見逃したに違いありません。ありがとう!
ブライアンJ

2

パイソン2524の 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。出力パーセンテージは、小数点以下2桁に完全に丸められます(フッターでは、すべての出力が行われます)。

fは、開始されるボード情報を含む2次元配列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

結果

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.