introduction
Aron Nimzowitsch était un grand maître d'échecs et un écrivain influent sur les échecs.
Dans son livre «Mon système», le premier chapitre traite de l'importance du centre et des raisons pour lesquelles vous devriez le dominer. La raison simple en est que vos pièces ont plus de possibilités de mouvements directs lorsqu’elles sont au centre, ce qui donne encore plus de puissance au joueur.
Cela devient très clair lorsque vous regardez les différentes positions d’un chevalier et son potentiel de déplacement (indiqué en rose) sur un tableau vide:
Objectif
Évaluez le nombre de déplacements directs potentiels d'un chevalier sur un plateau vide en fonction de sa position.
Spécifications d'entrée
La position du chevalier.
D'abord le x (colonne) et ensuite le y (rangée). 0 0
est le coin inférieur gauche.
Pour plus de simplicité, j'ai changé les étiquettes d'un échiquier en chiffres uniquement. Pour nos exemples et cas de test, nous utilisons un index basé sur 0, mais vous êtes libre d'utiliser un index basé sur 1.
Vous pouvez utiliser tout type de formats d'entrée possibles, un tableau, des arguments de fonction, etc.
Spécifications de sortie
Le nombre de potentiels mouvements directs suivants pour un chevalier sur un plateau vide.
Cas de test
3 4 => 8
4 6 => 6
7 7 => 2
1 0 => 3
Les cas de test utilisent un index basé sur 0. La grille de valeurs complète est:
2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2
Réponses:
Python 2 , 35 octets
Essayez-le en ligne!
Python 2 , 39 octets
Essayez-le en ligne!
Prend les entrées indexées par 0.
L'expression
x*(7-x)/5
prend les valeurs de coordonnées0..7
pour(
min(x,7-x,2)
Fait la même chose, mais est plus.) Pour résumer cela pourx
ety
donne le bon modèle , mais avec les mauvais chiffres(Voir la solution de Neil pour un meilleur raisonnement expliquant pourquoi cela donne le bon schéma.)
Enfin, la cartographie
a -> 50/(8-a)-4
avec division du sol donne les bonnes valeursUne solution alternative de même longueur avec des entrées à 1 index:
la source
(7-a)*a/5
est 3 octets plus court quemin(a,7-a,2)
.*l
coûte en fait un octet au total,lambda a,b:"23468"[(7-a)*a/5+(7-b)*b/5]
n’est que de 41 octets.x*(9-x)/6
un index.<strike>
comme tout le monde, les progrès du golf?MATL ,
17141312 octetsMerci à @Neil pour 1 octet de moins!
L'entrée est basée sur 1.
Essayez-le en ligne!
Explication
Ceci calcule la distance euclidienne entre l'entrée et chacune des 64 positions de l'échiquier et détermine combien de ces valeurs sont égales à la racine carrée de 5.
Étant donné que les coordonnées sont des valeurs entières, nous pouvons être sûrs que les deux valeurs à virgule flottante représentant la racine carrée de 5 (calculée à partir des coordonnées et calculée directement) sont bien identiques.
la source
double
nombre. Pour la sauvegarde d'un octetMathematica
6343 octetsAvec 20 octets sauvés grâce aux suggestions de Martin Ender!
Ce qui précède détermine le nombre de carrés situés à 1 saut de la cellule donnée sur le graphique complet de la tournée des chevaliers.
g=KnightTourGraph[8,8,VertexLabels->"Name",Axes->True]
affiche le graphe complet du tour du chevalier, avec les noms et les coordonnées des sommets. Notez que Mathematica utilise par défaut une indexation unique pour les coordonnées.
#+1+8#2&[r,f]
convertts renvoie le sommet correspondant au carré au rang (ligne),r
et au fichier (colonne),f
en utilisant des valeurs de base zéro en entrée.Par exemple,
#+1+8#2&[2,1]
retourne 11.EdgeCount
donne le nombre d'arêtes dans le graphe de voisinage.Les arêtes du rang 2, fichier 1 (carré 11):
Les bords surlignés:
Méthode 2: distance euclidienne
70 octets
Cette méthode est plus longue, mais peut-être d'un certain intérêt. L'approche consiste à vérifier la distance euclidienne entre le centre de l'échiquier et la cellule d'intérêt.
Illustrant
2
8
Pour aider à visualiser comment la distance entre le centre de l’échiquier est suffisante pour attribuer une valeur.
Cercle [{4.5, 4.5}, 4],
Cercle [{4.5, 4.5}, 4.6], Aplatir [f / @ {2, 3, 4, 6, 8}, 1]}, Axes -> Vrai, AxesOrigin -> {-1, -1}]
Les nombres 2.2, 3, 4 et 4.6 sont les rayons des cercles.
la source
KnightTourGraph
Mathematica et ses prémices ... :-)#
à la fin de votre code source (juste avant le]
). Vous devriez pouvoir utiliserIncidenceList
au lieu deEdgeList@NeighborhoodGraph
bien. (Alternativement, il y a aussiEdgeCount
, mais je pense que ça finit par être plus long.)EdgeCount[8~KnightTourGraph~8,#+1+8#2<->_]&
EdgeCount
est très cool!JavaScript (ES6), 38 octets
Prend des entrées à index 0. Explication: Regardez les carrés des distances au centre:
Le nombre de carrés accessibles se divise en cinq bandes:
En fait, je calcule 24,5 - (3,5 - x) ** 2 - (3,5 - y) ** 2 = (7 - x) * x + (7 - y) * y car c'est un calcul plus court, mais tout ce qu'il fait est inversé l'ordre des bandes.
la source
x*(7-x)
simplement à une opération qui ressemble à un arc descendant0..7
et qui arrive à ajuster la courbe, mais cela explique pourquoi elle produit un si joli motif quand elle est additionnée pourx
ety
.Gelée, 10 octets
1 indexé. Prend un seul argument de la forme
[x,y]
. Essayez ici.Dennis a sauvegardé un octet!
la source
Mathematica,
4440 octetsJ'ai actuellement trois solutions au même nombre d'octets:
Toutes ces fonctions sont des fonctions non nommées qui prennent une paire de coordonnées du type
{3, 4}
1.J'ai essayé de trouver une formule quelque peu explicite. Le schéma général sur tout le tableau ressemble à ceci:
Les valeurs réelles de ces couleurs (du plus clair au plus foncé) sont
2, 3, 4, 6, 8
. C'est:Nous exploitons d’abord la symétrie en déplaçant l’origine au centre, en prenant la valeur absolue et en soustrayant le résultat
4
. Cela nous donne des coordonnées0.5
à3.5
augmenter de chaque coin. Pour que les coordonnées du centre soient identiques, nous devons mapper0.5
et1.5
sur différentes valeurs2.5
et3.5
sur la même valeur. Cela se fait facilement en multipliant par0.8
(donne{0.4, 1.2, 2., 2.8}
) et en recouvrant le résultat. Alors maintenant, nous avons{0, 1, 2, 2}
comme distances du centre. Si nous additionnons les coordonnées dans chaque cellule, nous obtenons ce tableau:Cela a des valeurs uniques pour tous les différents résultats possibles, nous l’utilisons donc simplement comme index
2[3,4,6,8]
.Dans la deuxième version, nous utilisons plafond au lieu de plancher. De cette façon,
2
,3
et4
sont déjà corrects, mais nous obtenons5
et au6
lieu de6
et8
, donc nous corrigeons les manuellement à l' aide d' une règle de substitution.Enfin, dans la troisième version, nous étendons
5
et6
montons vers6
et8
à l'aide d'une exponentiation, suivie d'une autre opération d'étage.la source
APL, 21 caractères
En anglais:
(⍳8 8)
: Tableau 8x8 rang-2 contenant les coordonnées de toutes les cellules;+/¨×⍨(⍳8 8)-⊂⍵
: carré des distances euclidiennes de la cellule donnée par rapport à chaque cellule du tableau;5=
: matrice de 0/1, où les 1 apparaissent à des distances au carré égales à 5;+/,
: somme la matrice aplatieTest (en origine 1):
Sous cette forme:
l'argument de gauche peut spécifier les dimensions du tableau. Par conséquent
8 8 f
travaillera pour l'échiquier carré standard. Mais sur un tableau plus grand et rectangulaire, les cas de test donneraient des résultats différents. Par exemple, sur un tableau 12x10:la source
≢⍸5=+/¨×⍨-∘⎕¨⍳8 8
essayez-le en ligne!Java -
160150 octetsUngolfed:
Le code non-golfé est identique sauf que vous modifiez les limites de la boucle for pour économiser 4 octets. Fonctionne en parcourant chaque déplacement possible et en effectuant une vérification des limites (> 0 et <8). Utilise le fait que les décalages sont (1, 2), (2, 1), (-1, 2), (-2, 1), etc., et est capable de contrôler 2 coups pour chaque valeur de i et j.
Edit: 10 octets enregistrés grâce aux suggestions de Leaky Nun et de u902383.
la source
int m=0,i=-1,j;
pour économiser quelques octetsC, 44 octets
Mais c'est mieux:
la source
;
. Ne pas compiler.Haskell,
4948 octetsla source
[0..7]
dans une variable pour 1 octet.Java, 81 caractères (113 octets)
Encodez l'intégralité de la table de résultats sous forme de table unicode, puis obtenez les octets appropriés lors d'opérations au niveau du bit.
Vous pouvez le voir en ligne ici: https://ideone.com/K9BojC
la source
Python, 94 octets
Utilise 1 indexation basée.
Démo sur https://repl.it/C6gV .
la source
Pyth -
3315 octetsMerci à @ LeakyNun d'avoir réduit ma taille de moitié.
Réorganiser les cartes et
V
va probablement laisser un peu de côté au golf.Suite de test .
la source
APL (Dyalog Unicode) , SBCS de 15 octets
Essayez-le en ligne!
la source
J , 23 octets
Essayez-le en ligne!
Hommage à la méthode de Lynn, convertie en J
la source
En fait, 18 octets
Essayez-le en ligne!
Ce met en œuvre la même formule que beaucoup d' autres réponses ont utilisé:
50/(8-x*(7-x)//5+y*(7-y))//5)-4
. L'entrée est considérée comme une liste:[x,y]
(ou tout littéral itérable en Python, comme(x,y)
oux,y
).Explication:
la source
Perl 6 , 44 octets
Essayez-le en ligne!
la source