Quand Fibonacci rencontre les reines


18

(inspiré par la réponse d' Helka à mon appariement aléatoire de balises "échecs" et "Fibonacci" dans le chat)


Fibonacci

Les nombres de Fibonacci sont l'une des séquences les plus connues en mathématiques, où chaque nombre est composé en additionnant les deux nombres précédents ensemble. Voici une définition de la séquence indexée zéro:

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

Il en résulte la séquence 0, 1, 1, 2, 3, 5, 8, 13, 21, ...( lien OEIS ). Dans ce défi, nous nous concentrerons uniquement sur les valeurs strictement positives (donc 1, 1, 2, 3, ...), et vous pouvez choisir l'indexation zéro ou l'indexation unique, mais veuillez indiquer laquelle dans votre soumission.

Les nombres de Fibonacci peuvent être utilisés pour un pavage de l'avion, en utilisant des carrés f(n)de tailles successives et en alignant leurs bords ensemble. Le pavage se fait dans le sens inverse des aiguilles d'une montre, en plaçant des carrés dans le motif "droite-haut-gauche-bas" du carré actuel. Un exemple de ce pavage partiel pour f(8)=21, avec le carré de départ surligné en bleu, est le suivant:
Carrés de Fibonacci

Vous pouvez voir le f(1)=1comme le carré de départ (surligné en bleu), le f(2)=1carré placé à droite de celui-ci, le f(3)=2carré placé à partir de là, le f(4)=3carré placé à gauche et ainsi de suite. Le carré suivant serait f(9)=21+13=34et serait placé en bas. Il s'agit de la méthode de mosaïque partielle que nous utiliserons dans ce défi.


Les reines

Dans le jeu d' échecs , la pièce la plus puissante est la reine car elle peut déplacer n'importe quel nombre d'espaces horizontalement, verticalement ou en diagonale. Dans le diagramme ci-dessous, les carrés avec un cercle noir indiquent où la reine peut se déplacer:
La reine se déplace aux échecs

Nous définirons le terme couverture comme

Pourcentage de cases vers lesquelles la reine peut se déplacer par rapport au nombre total de cases, compte tenu de la position particulière de la reine sur un plateau vide, et en incluant la position de départ de la reine.

Pour l'exemple se déplace ci-dessus, la couverture de la reine est 28/64 = 43.75%. Si la reine était dans le h8carré supérieur droit , la couverture serait 22/64 = 34.375%. Si la reine était présente e7, la couverture le serait 24/64 = 37.5%.


Le défi

Nous allons utiliser le carrelage Fibonacci présenté ci-dessus comme échiquier pour ce défi. Vous recevrez deux entiers positifs en entrée net x:

  • Le nreprésente la taille du carrelage. L'exemple de pavage ci-dessus, avec le 21carré à gauche, est un tableau de taille n = 8depuis f(8) = 21(lorsqu'il est indexé zéro).
  • Le xreprésente lequel des carrés de Fibonacci est utilisé pour le placement de reine (s), pour le calcul de la couverture. Les reines sont placées une par une sur chaque case de cette tuile carrée Fibonacci particulière, et la couverture totale est la somme de la couverture individuelle (unique).

Par exemple, voici une image de n = 8(le même pavage que ci-dessus) et x = 4(correspondant au f(4) = 3carré, bleu ombré). En plaçant une reine une par une dans chacun de ces neuf carrés bleus, les reines peuvent (combinées) couvrir chaque carré ombré d'orange. La couverture totale dans cet exemple est donc 309/714 = 43.28%.

n = 8, x = 4

De toute évidence, à tout moment n = x, la couverture sera 100%(par exemple, avec n=8et x=8, vous pouvez voir que chaque carré de l'ensemble du plateau sera couvert au moins une fois). Inversement, avec un net x=1ou suffisamment grand x=2, la couverture va s'approcher (mais jamais atteindre) 0%(par exemple, avec n=8et x=1, la couverture est dérisoire 88/714 = 12.32%).

Étant donné deux de ces nombres d'entrée, vous devez générer le pourcentage de couverture, précis à deux décimales près. Veuillez spécifier comment votre code gère l'arrondi.


Règles

  • L'entrée et la sortie peuvent être données dans n'importe quel format pratique , mais doivent être précises à deux décimales près. Veuillez spécifier comment votre code gère l'arrondi.
  • Supposons qu'aucune autre pièce ne se trouve sur le plateau ou n'interfère autrement avec les mouvements.
  • Un programme complet ou une fonction sont acceptables. S'il s'agit d'une fonction, vous pouvez renvoyer la sortie plutôt que de l'imprimer.
  • Si possible, veuillez inclure un lien vers un environnement de test en ligne afin que d'autres personnes puissent essayer votre code!
  • Les failles standard sont interdites.
  • Il s'agit de donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.

Exemples

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

Ma photo de profil est semi-pertinente
Stephen

"Quand Fibonacci a rencontré les reines"? Ou "Fibonacci rencontre les reines"?
Jonathan Allan


@JonathanAllan Le titre est correct tel quel. Il est présent à titre indicatif comme dans "c'est ce qui arrive quand X arrive". "Quand Henry rencontre Sally pour le déjeuner, ils mangent toujours des hamburgers."
AdmBorkBork

Ah, tu veux dire "Quand Fibonacci rencontre les reines ..."!
Jonathan Allan

Réponses:


2

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

-9 octets grâce à @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

Simulation de l'énoncé du problème. Je commence par créer la grille, en parcourant chaque nouveau numéro de fibonacci pour augmenter la taille du carré. Je stocke l'index dans chaque cellule, afin qu'il soit facile de trouver où iront les reines à l'étape suivante.

Ensuite, je trouve chaque cellule qui devrait contenir une reine et marque chaque carré menacé avec un zéro. Je saute les cellules où se trouvent les reines pour ne pas avoir à me soucier de revenir en arrière.

À la fin, je compte les cellules effacées et les cellules avec des reines, puis je les divise par le nombre total d'espaces. Multipliez par 100 pour obtenir le pourcentage et arrondissez aux deux décimales les plus proches.


Ne pouvez-vous pas changer hitspour un nom de variable plus court? Je ne connais pas VB.NET, mais je suppose que c'est une variable.
2017

@ oui totalement humain, c'est exact. Je suis passé à la main et j'ai dû rater celui-là. Merci!
Brian J

2

Python 2 , 524 499 octets

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

Essayez-le en ligne!

Définir une fonction qui prend à la fois la taille du carrelage net le nombre carré de fibonacci de la reine x. Le pourcentage de sortie est arrondi à deux décimales près (dans le pied de page, où toutes les sorties ont lieu).

fest un tableau bidimensionnel contenant les informations de la carte en cours d'initiation 0. Ensuite, l'échiquier fibonacci est calculé et peuplé de reines où les reines doivent être. Ces reines sont ensuite déplacées vers tous les endroits où elles peuvent être déplacées; toutes les positions sont comptées et imprimées en pourcentage de l'ensemble du tableau.


1

Mathematica 11.1, 336 octets, basé sur 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]

Utilisation: k[n, x]. Faites attention au fait que la fonction est basée sur 1. L'arrondi est obtenu parRound[100x,0.01]

Fondamentalement, p[i]est une fonction de la détermination de la position de chaque carré. Et la zone est calculée par des fonctions de niveau supérieur aiment RegionIntersection, RegionUnion,RegionMeasure

résultat

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.