Récemment, j'ai été initié à un jeu de puzzle connu sous le nom d' échecs solitaires . Je résume les règles ici:
- La planche est un damier 4x4.
- Toutes les pièces sont de la même couleur (pas d'équipes) et toutes les pièces peuvent capturer n'importe quelle autre pièce.
- Chaque mouvement doit être une capture. Pas de déplacement vers des cases vides.
- Il doit rester exactement une pièce à la fin.
- Toutes les pièces se déplacent exactement comme aux échecs, avec une seule modification: le pion peut capturer dans n'importe quelle direction diagonale (ce qui en fait techniquement un ferz ). Pour ceux qui ne le savent pas, j'ai inclus des diagrammes de mouvement.
- Aucune des autres règles d'échecs (comme le chèque, le roque, etc.) ne s'applique ici. Il s'agit de captures.
Roi (K)
K * . . | * K * . | * * * .
* * . . | * * * . | * K * .
. . . . | . . . . | * * * .
. . . . | . . . . | . . . .
Reine (Q)
Q * * * | * Q * * | * * * .
* * . . | * * * . | * Q * *
* . * . | . * . * | * * * .
* . . * | . * . . | . * . *
Tour (R)
R * * * | * R * * | . * . .
* . . . | . * . . | * R * *
* . . . | . * . . | . * . .
* . . . | . * . . | . * . .
Évêque (B)
B . . . | . B . . | * . * .
. * . . | * . * . | . B . .
. . * . | . . . * | * . * .
. . . * | . . . . | . . . *
Chevalier (N)
N . . . | . N . . | . . . *
. . * . | . . . * | . N . .
. * . . | * . * . | . . . *
. . . . | . . . . | * . * .
Pion (P)
P . . . | . P . . | * . * .
. * . . | * . * . | . P . .
. . . . | . . . . | * . * .
. . . . | . . . . | . . . .
Entrée sortie
Pour référence, l'exemple de puzzle de la page Web Solitaire Chess sera utilisé:
. . . .
. B . .
R P . .
. . . N
La solution est de prendre le pion avec le chevalier, puis de prendre le chevalier avec la tour, et enfin de prendre l'évêque avec la tour.
Contribution
L'entrée doit être sous l'une des trois formes; vous êtes libre de choisir celui qui vous convient le mieux.
- Une chaîne de caractères tels que
.....B..RP.....N
, avec ou sans retour à la ligne. Le caractère représentant un espace vide peut être n'importe quel caractère qui n'en fait pas partieKQRBNP
. - Une liste de listes (ou une liste aplatie) où les éléments sont soit des caractères soit des nombres, comme ceci:
[['.', '.', '.', '.'], ['.', 'B', '.', '.'], ['R', 'P', '.', '.'], ['.', '.', '.', 'N']]
ou[[0, 0, 0, 0], [0, 4, 0, 0], [3, 6, 0, 0], [0, 0, 0, 5]]
. Pour les premiers, le caractère qui représente un espace vide peut être tout ce qui n'en fait pas partieKQRBNP
. Pour ce dernier, j'ai donné aux pièces le nombre qui correspond à leur rang dans ma liste de mouvements précédente (1
est un roi,4
est un évêque,6
est un pion, etc.). Vous êtes libre de modifier la numérotation. - Une liste de coordonnées où chaque élément a la forme
[x, y, 'c']
, comme suit:[[1, 2, 'B'], [0, 1, 'R'], [1, 1, 'P'], [3, 0, 'N']]
.
Si vous choisissez l'un des formats d'entrée basés sur une liste, les séparateurs et délimiteurs peuvent être des caractères raisonnables et compréhensibles.
Production
La sortie doit être une séquence de mouvements ou une séquence d'états de carte. Certains puzzles ont plus d'une solution; vous pouvez en sortir un ou tous. Si vous choisissez de sortir une séquence d'états de carte, chaque carte doit être dans l'un des trois formats d'entrée, avec un séparateur raisonnable (comme des sauts de ligne) entre eux.
Si vous choisissez de produire une séquence de mouvements, ils doivent être exprimés en une liste de paires de paires de coordonnées, comme suit: [[[3,0], [1,1]], [[0,1], [1,1]], [[1,1], [1,2]]]
. [0,0]
représente le coin inférieur gauche, et encore une fois, séparer et délimiter les caractères peut être un choix raisonnable.
Si une carte donnée ne peut pas être résolue, sortez toute valeur falsifiée ( 0
, chaîne vide, etc.). Si une planche donnée a moins de deux pièces, le comportement n'est pas défini.
Cas de test
Remarque: les sorties ne sont données que sous forme de liste de paires de coordonnées, car les autres formats devraient être assez faciles à vérifier pour l'exactitude (et je n'ai pas envie de taper tous les formats de sortie possibles). De plus, pour les puzzles qui ont plus d'une solution, une seule possibilité est fournie.
Entrée 1:
. . . N
. . . .
. R . .
. . B .
...N.....R....B.
[['.', '.', '.', 'N'], ['.', '.', '.', '.'], ['.', 'R', '.', '.'], ['.', '.', 'B', '.']]
[[0, 0, 0, 5], [0, 0, 0, 0], [0, 3, 0, 0], [0, 0, 4, 0]]
[[3, 3, 'N'], [1, 1, 'R'], [2, 0, 'B']]
Sortie 1:
[[[2,0], [1,1]], [[1,1], [3,3]]]
Entrée 2:
. . . .
. B . .
R P . .
. . . N
.....B..RP.....N
[['.', '.', '.', '.'], ['.', 'B', '.', '.'], ['R', 'P', '.', '.'], ['.', '.', '.', 'N']]
[[0, 0, 0, 0], [0, 4, 0, 0], [3, 6, 0, 0], [0, 0, 0, 5]]
[[1, 2, 'B'], [0, 1, 'R'], [1, 1, 'P'], [3, 0, 'N']]
Sortie 2:
[[[3,0], [1,1]], [[0,1], [1,1]], [[1,1], [1,2]]]
Entrée 3:
. N R .
B . . .
N . . B
. . P .
.NR.B...N..B..P.
[['.', 'N', 'R', '.'], ['B', '.', '.', '.'], ['N', '.', '.', 'B'], ['.', '.', 'P', '.']]
[[0, 5, 3, 0], [4, 0, 0, 0], [5, 0, 0, 4], [0, 0, 6, 0]]
[[1, 3, 'N'], [2, 3, 'R'], [0, 2, 'B'], [0, 1, 'N'], [3, 1, 'B'], [2, 0, 'P']]
Sortie 3:
[[[2,0], [3,1]], [[0,1], [1,3]], [[0,2], [1,3]], [[2,3], [1,3]], [[3,1], [1,3]]]
Entrée 4:
. . . N
. . . R
R B B .
N P P .
...N...RRBB.NPP.
[['.', '.', '.', 'N'], ['.', '.', '.', 'R'], ['R', 'B', 'B', '.'], ['N', 'P', 'P', '.']]
[[0, 0, 0, 5], [0, 0, 0, 3], [3, 4, 4, 0], [5, 6, 6, 0]]
[[3, 3, 'N'], [3, 2, 'R'], [0, 1, 'R'], [1, 1, 'B'], [2, 1, 'B'], [0, 0, 'N'], [1, 0, 'P'], [2, 0, 'P']]
Sortie 4:
[[[2,1], [3,2]], [[1,1], [3,3]], [[3,2], [1,0]], [[3,3], [0,0]], [[0,1], [0,0]], [[0,0], [1,0]], [[1,0], [2,0]]]
Entrée 5:
P . . .
. R . .
R . R .
. R . .
P....R..R.R..R..
[['P', '.', '.', '.'], ['.', 'R', '.', '.'], ['R', '.', 'R', '.'], ['.', 'R', '.', '.']]
[[6, 0, 0, 0], [0, 3, 0, 0], [3, 0, 3, 0], [0, 3, 0, 0]]
[[0, 3, 'P'], [1, 2, 'R'], [0, 1, 'R'], [2, 1, 'R'], [1, 0, 'R']]
Résultat 5:
[[[0,3], [1,2]], [[1,2], [2,1]], [[2,1], [1,0]], [[1,0], [0,1]]]
Entrée 6:
. P . N
K . . .
. . B .
. . R Q
.P.NK.....B...RQ
[['.', 'P', '.', 'N'], ['K', '.', '.', '.'], ['.', '.', 'B', '.'], ['.', '.', 'R', 'Q']]
[[0, 6, 0, 5], [1, 0, 0, 0], [0, 0, 4, 0], [0, 0, 3, 2]]
[[1, 3, 'P'], [3, 3, 'N'], [0, 2, 'K'], [2, 1, 'B'], [2, 0, 'R'], [3, 0, 'Q']]
Résultat 6:
[[[3,0], [2,0]], [[2,0], [2,1]], [[3,3], [2,1]], [[2,1], [1,3]], [[0,2], [1,3]]]
[["R", [2, 0], [1, 1]], ["N", [1, 1], [3, 3]]]
Réponses:
Haskell,
226195191188 octetsRenvoie une liste de toutes les solutions. Chaque solution est une liste de mouvements. Renvoie une liste vide s'il n'y a pas de solution.
Enregistré 4 octets Merci à Lynn.
Essayez-le en ligne
Usage:
Production:
la source
!
enregistre quelques octets:f l=[(i,j):r|(i@(s,t),a)<-l,(j@(u,v),_)<-l%i,r<-f$(j,a):l%i%j,(s-u)^2+(t-v)^2`elem`m a]
[[((2,0),(1,1)),((1,1),(3,3))]]
. Une liste de solutions, où une solution est une liste de mouvements, où un mouvement est((x1,y1),(x2,y2))
.m"P"=[1]
Ça ne devrait pas être 2?Javascript (ES6),
372361358 octetsIl a (encore) besoin d'être optimisé. Mais voici une
première2e3e tentative.Format de sortie:
Exemple:
la source