Il s'agit du trou 3 du tournoi d'automne d'APL CodeGolf . Je suis l'auteur original du problème là-bas, et donc autorisé à le publier à nouveau ici.
Donné:
un certain nombre de tours (veuillez indiquer si aucun mouvement n'est égal à 0, sinon nous supposerons qu'il s'appelle 1) et
une liste d'une ou plusieurs positions de départ (sous n'importe quelle forme, par exemple 0 ou 1 coordonnées indexées ou 64 nombres / caractères consécutifs ou A1 – H8 - indiquer laquelle), sur un échiquier de 8 par 8,
retourner (dans n'importe quel ordre) la liste des positions uniques (dans le même format que l'entrée) où le chevalier peut se trouver après le nombre de tours donné.
Chaque chevalier doit se déplacer à chaque tour, mais vous n'avez pas à vous soucier de plusieurs chevaliers occupant la même case.
Un chevalier ne peut se déplacer qu'aux positions marquées d'un X par rapport à sa position actuelle, marquées d'un ♞:
Exemples (coordonnées indexées 1)
1
passer de [[1,1]]
: [[2,3],[3,2]]
2
se déplace de [[1,1]]
: [[1,1],[1,3],[1,5],[2,4],[3,1],[3,5],[4,2],[4,4],[5,1],[5,3]]
1
passer de [[1,1],[5,7]]
: [[2,3],[3,2],[3,6],[3,8],[4,5],[6,5],[7,6],[7,8]]
2
se déplace de [[1,1],[5,7]]
: [[1,1],[1,3],[1,5],[1,7],[2,4],[2,6],[2,8],[3,1],[3,3],[3,5],[3,7],[4,2],[4,4],[4,6],[4,8],[5,1],[5,3],[5,5],[5,7],[6,4],[6,6],[6,8],[7,3],[7,7],[8,4],[8,6],[8,8]]
0
se déplace de [[3,4]]
: [[3,4]]
[[1,1]], 2 -> [[2,3],[3,2]]
Réponses:
Wolfram Language (Mathematica) , 45 octets
Parce que l'autre solution est incorrecte (voir le commentaire de Martin ci-dessous), je décide donc de poster ma solution:
Essayez-le en ligne!
Notation infixe ultime ...
Prend 2 entrées, le premier est une liste de nombres dans la gamme
[1,64]
décrivant les positions de départ du chevalier, le second est le nombre de pas.Cette solution repose sur l'extrême commodité des fonctions intégrées de Mathematica:
AdjacencyList
peut prendre une liste de sommets sur son côté droit, et retourner une liste de sommets adjacents à l'un de ceux-ci, les doublons déjà supprimés et triés .KnightTourGraph
est une fonction intégrée. Pas étonnant.Nest
prend les arguments dans l'ordreNest[f, expr, n]
, que nous pouvons répartir##
sur son côté droit commeNest[f, ##]
.a~b~c~d~e
comme(a~b~c)~d~e
, donc aucun crochet n'est nécessaire. Sans notation infixée et aplatie##
, ce serait le casNest[AdjacencyList[KnightTourGraph[8, 8], #] &, #, #2]&
.la source
JavaScript (ES7), 99 octets
Format d'entrée / sortie: indices carrés dans [0 ... 63] .
Cas de test
Cet extrait de code comprend deux fonctions d'assistance pour traduire à partir et vers le format fourni par l'OP.
Afficher l'extrait de code
Comment?
Un mouvement de (x, y) vers (X, Y) est un mouvement de chevalier valide si nous avons soit:
En mettant au carré au lieu d'utiliser des valeurs absolues, cela peut s'exprimer comme suit:
Parce que 1 et 4 sont les seuls carrés parfaits qui donnent 5 lorsque XOR sont ensemble, nous avons un mouvement de chevalier valide si:
(xX) ² XOR (yY) ² XOR 5 = 0
Nous appliquons cette formule à chaque carré p = 8y + x sur le plateau et à chaque carré de chevalier P = 8Y + X pour déduire les nouveaux carrés cibles de chevalier possibles, et répétons récursivement ce processus n fois.
la source
Octave, 69 octets
Démo en ligne!
L'entrée / sortie est la configuration de la carte au début / fin en tant que matrice binaire 8 * 8.
Explication:
Pour les
n
étapes, répétez la dilatation morphologique de la planche avec le masque suivant:la source
Rétine ,
147102 octetsEssayez-le en ligne! Prend la saisie comme une planche de 8x8
:
avec les chevaliers marqués avecN
s, avec un chiffre pour le nombre de tours sur la ligne suivante (cela n'a aucun sens d'avoir plus de 9 tours, mais si vous insistez, je peux le supporter pour un supplément octet). Notez que la sortie contient un espace blanc supplémentaire. Edit: 45 octets enregistrés grâce à @MartinEnder. Explication: La première étape convertit le nombre de tours en unaire, mais en utilisant des caractères de tabulation, afin qu'ils ne soient pas appariés plus tard par accident, tandis que la deuxième étape ajoute des espaces à droite du tableau pour empêcher les regex de s'enrouler le bord. La troisième étape remplace tous lesN
s et:
s qui sont à l'écart d'un chevalierN
avec unn
tandis que la quatrième étape supprime toutN
s restant , change lan
s àN
s et soustrait 1 du nombre de coups. Cela se répète jusqu'à ce que le nombre de coups soit nul.la source
Gelée , 29 octets
Essayez-le en ligne!
Coordonnées indexées 0. Presque certain que ce n'est pas optimal.
-1 octet grâce à user202729
Explication
la source
Ç
.05AB1E ,
2725 octetsMerci à Emigna pour avoir économisé 2 octets!
Utilise des coordonnées indexées 1.
Code:
Utilise l' encodage 05AB1E . Essayez-le en ligne!
Explication:
Cela nous donne le tableau suivant:
Quels sont les deltas des mouvements du chevalier.
la source
•eĆ•SÍü‚
au lieu deƵ‡4в2ô<D(«
pour enregistrer 2 octets.Python 3, 105 octets
Vous devez utiliser un lambda nommé pour la récursivité. Je ne sais pas si c'est disqualifiant. Passez dans les positions de départ en tant que liste de nombres carrés indexés 0. 0 compte comme aucun mouvement.
la source
Java (OpenJDK 8) , 124 octets
Essayez-le en ligne!
Format d'entrée / sortie
L'entrée / sortie est représentée sous forme de bits dans un
long
(64 bits): les bits définis signifient qu'un cheval est présent, les bits non définis signifient qu'il n'y a pas de cheval. Exemple:Explications
Crédits
(X-x)²+(Y-y)²==5
tour d'Arnauld réponse JavaScriptint[]
à 64 bitslong
.la source
(m,p)->{for(;m-->0;){int i=64,a[]=p,x,y,u[]={1,3,5,9,15,19,21,23};for(p=new int[i];i-->0;)for(int z:u)if((((x=i/8+z/5-2)|(y=i%8+z%5-2))&-8)==0)p[x*8+y]|=a[i];}return p;}
(m,p)->{for(int i,j,a[],x;m-->0;)for(a=p,p=new int[i=64];i-->0;)for(j=64;j-->0;)p[j]|=(x=i%8-j%8)*x+(x=i/8-j/8)*x==5?a[i]:0;return p;}
int[]
parlong
:(m,p)->{for(long i,j,a;m-->0;)for(a=p,p=i=0;i<64;i++)for(j=64;j-->0;)p|=(p=i%8-j%8)*p+(p=i/8-j/8)*p==5?(a>>i&1)<<j:0;return p;}
Gelée ,
2928 octetsEssayez-le en ligne!
Le nombre de tours passe par STDIN et les carrés sont un argument.
Cela lie la solution Jelly d'HyperNeutrino, mais avec une approche différente.Battre maintenant @HyperNeutrino par 1 octet entier!
Toutes les suggestions pour supprimer certains octets sont souhaitées!
Lien 1 (l'échiquier)
Lien 2 (génération de déplacement)
Lien 3 (vérification carrée)
la source
Husk , 18 octets
Utilise l'indexation 1 des carrés et des pas. Essayez-le en ligne!
Explication
la source
R ,
145183134 octetsC'est le résultat de l'excellent golf de Giuseppe de mon algo initial pas trop golfique (voir commentaire ci-dessous)
Essayez-le en ligne!
L'entrée et la sortie sont basées sur 1 ... 64. Prend un vecteur de position en utilisant la notation 1 ... 64. Mappe à une notation 1: 576, c'est-à-dire une super-planche composée de neuf cartes. Dans cette notation, à chaque itération, chaque chevalier devrait pouvoir se déplacer de +/- 22,26,47,49 Retourner les positions futures dans la notation 1 ... 64, à l'exclusion de celles qui tombent du plateau central. L'exemple TIO affiche le résultat à l'aide d'une matrice 8x8.
la source
[0...63]
notation à la place.[1..64]
pour entrée et sortie. +1, cependant, c'est une excellente réponse.