Étant donné deux positions différentes sur un échiquier et le type de pièce, sortez le nombre minimum de mouvements qu'il faudra pour que cette pièce passe d'une position à une autre.
Règles
La pièce donnée peut être King, Queen, Rook, Knight et Bishop. (Cette entrée peut être considérée comme 5 caractères uniques)
Les 2 positions peuvent être prises dans n'importe quel format pratique,
Example:
a8 b8 c8 d8 ... h8
a7 b7 c7 d7 ... h7
...
...
a1 b1 c1 d1 ... h1
Dans le cas où la pièce ne peut pas l'atteindre, sortez autre chose qu'un entier positif.
Exemples
i/p ---- o/p
King
a1,a4 3
a1,h6 7
b3,h5 6
Queen
a1,a4 1
a1,h6 2
b3,f7 1
Rook
a1,a4 1
a1,h6 2
h2,c7 2
Knight
a1,a4 3
a1,h6 4
b2,d3 1
b2,c3 2
b3,c3 3
a1,b2 4
Bishop
a1,a4 -1
a1,h6 2
b2,d3 -1
e1,h4 1
Réponses:
JavaScript (Node.js) ,
183180179 octetsEssayez-le en ligne!
Si longtemps pour le cas de bord, merci Arnauld pour avoir vérifié. Test de chevalier
la source
max
par un ternaire.APL (Dyalog Classic) ,
117107105103989795928987 octetsEssayez-le en ligne!
l'argument de gauche est de type pièce: 0 = roi, 1 = reine, 2 = tour, 3 = chevalier, 4 = évêque; l'argument de droite est une matrice 2x2 de coordonnées, chaque ligne représentant une position; renvoie 0 pour inaccessible
|-⌿⍵
calcule la paire [abs (∆x), abs (∆y)](⍎⍺⊃
...)⊣
choisit une expression dans la liste "..."; si c'est une fonction, elle est appliquée à|-⌿⍵
; si c'est une valeur (cela ne se produit que pour un chevalier),⊣
assurez-vous de la retourner au lieu de|-⌿⍵
roi: max (
⌈/
) des abs ∆-sreine: supprimer les zéros (
~∘0
) et compter (≢
) unique (∪
)tour: somme (
+/
) de signa (monadique×
; 0 pour 0, 1 pour positif)chevalier:
{⍺∊⍵:0⋄1+⍺∇i/⍨∨⌿2=|×/↑⍵∘.-i←,⍳8 8}/,¨⊂¨↓⍵
- commencez par la position initiale et calculez récursivement des générations de mouvements de chevalier jusqu'à ce que la position finale soit dans l'ensemble; retourner la profondeur de récursivitéévêque: les parités des deux ∆-s sont-elles égales? (
2=.|⊢
, équivalent à=/2|⊢
) multipliez le résultat booléen (0 ou 1) par count-unique (≢∘∪
)la source
⍎⍺⊃
. Très intelligent.Java (JDK) , 229 octets
Essayez-le en ligne!
Explications
Code:
Crédits
la source
Fusain , 108 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Liste tous les 64 carrés du tableau dans la variable de liste vide prédéfinie.
Faites une liste de listes dont la première entrée est une liste contenant la position de départ.
Répétez jusqu'à ce que la dernière entrée de la liste contienne la position finale.
Filtrer toutes les positions du tableau qui éloignent un chevalier de toute entrée dans la dernière entrée de la liste des listes et pousser cette liste dans la liste des listes. Cela inclut les postes précédemment visités, mais nous n'étions pas intéressés par eux de toute façon, nous nous retrouvons donc avec une première recherche approfondie du tableau pour la position finale.
Calculez les différences absolues de coordonnées entre les positions de début et de fin.
Sélectionnez en fonction de la pièce d'entrée.
S'il s'agit d'un roi, imprimez la différence de coordonnées absolue maximale.
Si c'est une reine, imprimez 2 à moins que les deux différences soient égales ou que l'une soit nulle.
S'il s'agit d'une tour, imprimez 2, sauf si l'une des différences est zéro.
Si c'est un évêque, imprimez 0 si les carrés sont de parité opposée, sinon imprimez 2 à moins que les deux différences soient égales.
Si c'est un chevalier, imprimez le nombre de boucles prises pour trouver la position finale.
la source
Japt , 67 octets
Essayez-le en ligne!
Ce fut toute une expérience. Je me suis beaucoup inspiré de l'excellente réponse APL . Je soupçonne qu'il y a encore beaucoup de golf possible, surtout dans le code Knight.
Les positions sont la première entrée, sous la forme
[[x1,x2],[y1,y2]]
. Cela devrait également fonctionner[[y1,y2],[x1,x2]]
correctement. La sélection des pièces est la deuxième entrée, avec 0 = roi, 1 = reine, 2 = chevalier, 3 = tour, 4 = évêque. Notez que Knight et Rook sont échangés par rapport à la réponse APL.Explication:
la source
á
raccourcissait[[1,2][2,1]]
considérablement.á
, sympa!U
est implicite après@
, vous pouvez donc enregistrer deux octets dans la fonction chevalier. Vous pouvez également le démarrer avec@=ã ü;
pour en enregistrer un autre. (L'ã
astuce est aussi intelligente :-))