Fibonacci Kraliçelerle buluştuğunda


18

( Helka'nın sohbetteki "satranç" ve "Fibonacci" etiketlerini rastgele eşleştirmemdeki tepkisinden esinlenerek )


Fibonacci

Fibonacci sayıları her sayı birlikte iki önceki numaraları eklenerek oluşan matematik daha iyi bilinen dizilerin biri. Aşağıda sıfır endeksli dizinin bir tanımı bulunmaktadır:

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

Bu sekansla sonuçlanır 0, 1, 1, 2, 3, 5, 8, 13, 21, ...( OEIS bağlantısı ). Bu meydan okumada, yalnızca kesinlikle pozitif değerlere (yani 1, 1, 2, 3, ...) odaklanacağız ve sıfır endeksleme veya tek endeksleme seçebilirsiniz, ancak lütfen gönderiminizde hangisini belirttiğinizi belirtin.

Fibonacci sayıları, f(n)boyut olarak birbirini takip eden kareler kullanarak ve kenarlarını birbirine hizalayarak düzlemin döşenmesi için kullanılabilir . Döşeme, geçerli kareden "sağ-yukarı-sol-aşağı" desenine kareler yerleştirerek saat yönünün tersine yapılır. f(8)=21Başlangıç ​​kare mavi renkle vurgulanmış olarak bu kısmi döşemeye bir örnek şöyledir:
Fibonacci Kareleri

Görebilirsiniz f(1)=1(mavi vurgulanmış) başlangıç meydanına olarak f(2)=1yerleştirilmiş karenin sağ bunun, f(3)=2kare yerleştirilmiş yukarı , oradan f(4)=3kare yerleştirilir sol bu kadar ve. Bir sonraki kare f(9)=21+13=34tabana yerleştirilir ve tabana yerleştirilir. Bu meydan okumada kullanacağımız kısmi döşeme yöntemidir.


Kraliçeler

Satranç oyununda en güçlü parça kraliçedir, çünkü herhangi bir sayıda alanı yatay, dikey veya çapraz olarak hareket ettirebilir. Aşağıdaki tahta şemasında, siyah daireli kareler kraliçenin hareket edebileceği yerleri gösterir:
Kraliçe satranç hamle

Biz terimi tanımlarsınız kapsama olarak

Kraliçenin boş bir tahtadaki belirli konumu göz önüne alındığında ve kraliçenin kendi başlangıç ​​konumu dahil olmak üzere, kraliçenin toplam kareye karşı hareket edebileceği karelerin yüzdesi.

Yukarıdaki örnek hareketler için kraliçenin kapsamı 28/64 = 43.75%. Kraliçe sağ üst h8köşede olsaydı, kapsama alanı olurdu 22/64 = 34.375%. Kraliçe e7olsaydı, kapsam da olurdu 24/64 = 37.5%.


Meydan okuma

Bu meydan okuma için yukarıda gösterilen Fibonacci fayansını satranç tahtası olarak kullanacağız. Size girdi olarak iki pozitif tamsayı verilir nve x:

  • nFayans ne kadar geniş temsil eder. Yukarıdaki örnek döşeme 21, soldaki kare ile, o n = 8zamandan beri bir boyut tahtasıdır f(8) = 21(sıfır indekslendiğinde).
  • xKapsamını hesaplamak için, kraliçe (ler) yerleştirilmesi için kullanılan Fibonacci kareler simgelemektedir. Kraliçeler, belirli Fibonacci kare döşemesindeki her karede birer birer yerleştirilir ve toplam kapsam, bireysel (benzersiz) kapsamın toplamıdır.

Örneğin, burada n = 8(yukarıdakiyle aynı döşeme) ve x = 4( f(4) = 3kare, gölgeli maviye karşılık gelen ) bir görüntü var . Bu dokuz mavi karenin her birine birer birer kraliçe yerleştirerek, kraliçeler turuncu gölgeli her kareyi kaplayabilir (birleştirebilir). Bu örnekteki toplam kapsam bu nedenle 309/714 = 43.28%.

n = 8, x = 4

Oldukça açıktır ki, n = xkapsama alanı ne zaman olursa olsun 100%(örneğin, n=8ve x=8ile, tüm tahtadaki her karenin en az bir kez kaplanacağını görebilirsiniz). Tersine, uygun büyüklükte nve / x=1veya x=2kapsama yaklaşacak (ama asla ulaşamayacak) 0%(örneğin, n=8ve ile x=1kapsama bir paltry'dir 88/714 = 12.32%).

Bu tür iki giriş numarası verildiğinde, iki ondalık basamağa kadar kapsama yüzdesi vermeniz gerekir. Lütfen kodunuzun yuvarlamayı nasıl işlediğini belirtin.


kurallar

  • Giriş ve çıkış herhangi bir uygun biçimde verilebilir , ancak iki ondalık basamağa kadar doğru olmalıdır. Lütfen kodunuzun yuvarlamayı nasıl işlediğini belirtin.
  • Tahtada başka hiçbir parçanın olmadığını veya hareketlere başka türlü müdahale etmediğini varsayın.
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine döndürebilirsiniz.
  • Mümkünse, diğer kişilerin kodunuzu deneyebilmesi için lütfen bir çevrimiçi test ortamına bağlantı ekleyin!
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Örnekler

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

Profil resmim yarı alakalı
Stephen

"Fibonacci Kraliçelerle tanıştığında "? Yoksa "Fibonacci Kraliçelerle Buluşuyor" mu?
Jonathan Allan


@JonathanAllan Başlık olduğu gibi doğrudur. "X meydana geldiğinde olan budur." "Henry Sally ile öğle yemeğinde buluştuğunda, daima hamburger yerler."
AdmBorkBork

Ah, "Fibonacci Kraliçelerle buluştuğunda ..." demek istiyorsun!
Jonathan Allan

Yanıtlar:


2

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

@Totallyhuman sayesinde -9 bayt

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

Sorun ifadesinin simülasyonu. Kare boyutunu artırmak için her yeni fibonacci sayısı arasında döngü oluşturarak ızgara oluşturarak başlıyorum. Dizini her hücrede saklıyorum, böylece kraliçelerin bir sonraki adımda nereye gideceğini bulmak kolay.

Sonra, içinde bir kraliçe olması gereken her hücreyi buluyorum ve tehdit altındaki her kareyi sıfırla işaretliyorum. Kraliçelerin bulunduğu hücreleri atlıyorum, böylece geri takip konusunda endişelenmem gerekmiyor.

Sonunda, temizlenen hücreleri ve kraliçeli hücreleri sayıyorum ve daha sonra toplam boşluk sayısına böldüm. Yüzdeyi almak için 100 ile çarpın ve en yakın iki ondalık basamağa yuvarlayın.


Daha hitskısa bir değişken adıyla değiştiremez misiniz? VB.NET bilmiyorum, ama bunun bir değişken olduğunu varsayıyorum.
totallyhuman

@totallyhuman evet, bu doğru. El ile geçtim ve bunu kaçırmış olmalıyım. Teşekkürler!
Brian J

2

Python 2 , 524499 bayt

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

Çevrimiçi deneyin!

Hem döşeme boyutunu nhem de kraliçenin fibonacci kare numarasını alan bir fonksiyon tanımlamak x. Çıkış yüzdesi dikey olarak iki ondalık basamağa yuvarlanır (tüm çıktının gerçekleştiği altbilgide).

fbaşlatılan kart bilgisini içeren iki boyutlu bir dizidir 0. Daha sonra, fibonacci satranç tahtası hesaplanır ve kraliçelerin olacağı kraliçelerle doldurulur. Bu kraliçeler daha sonra taşınabilecekleri her yere taşınırlar; tüm pozisyonlar sayılır ve tüm kartın yüzdesi olarak yazdırılır.


1

Mathematica 11.1, 336 bayt, 1 tabanlı

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]

Kullanımı: k[n, x]. İşlevin 1 tabanlı olduğuna dikkat edin. YuvarlamaRound[100x,0.01]

Temel olarak, p[i]her karenin konumunu belirleme işlevidir. Ve alan fonksiyonları gibi üst düzey hesaplanır RegionIntersection, RegionUnion,RegionMeasure

sonuç

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.