Vor kurzem wurde ich in ein Puzzlespiel eingeführt, das als Solitaire Chess bekannt ist . Ich werde die Regeln hier zusammenfassen:
- Das Board ist ein 4x4 Schachbrett.
- Alle Teile haben die gleiche Farbe (keine Teams) und alle Teile können alle anderen Teile erfassen.
- Jeder Zug muss eine Gefangennahme sein. Keine Bewegung auf leere Felder.
- Am Ende muss genau ein Stück übrig sein.
- Alle Figuren bewegen sich genau wie im Schach, mit einer Modifikation: Der Bauer kann in jede diagonale Richtung fangen (was es technisch gesehen zu einem Ferz macht ). Für diejenigen, die es vielleicht nicht wissen, habe ich Bewegungsdiagramme beigefügt.
- Keine der anderen Schachregeln (wie Scheck, Rochade usw.) findet hier Anwendung. Es geht nur um Captures.
König (K)
K * . . | * K * . | * * * .
* * . . | * * * . | * K * .
. . . . | . . . . | * * * .
. . . . | . . . . | . . . .
Königin (Q)
Q * * * | * Q * * | * * * .
* * . . | * * * . | * Q * *
* . * . | . * . * | * * * .
* . . * | . * . . | . * . *
Turm (R)
R * * * | * R * * | . * . .
* . . . | . * . . | * R * *
* . . . | . * . . | . * . .
* . . . | . * . . | . * . .
Bischof (B)
B . . . | . B . . | * . * .
. * . . | * . * . | . B . .
. . * . | . . . * | * . * .
. . . * | . . . . | . . . *
Ritter (N)
N . . . | . N . . | . . . *
. . * . | . . . * | . N . .
. * . . | * . * . | . . . *
. . . . | . . . . | * . * .
Bauer (P)
P . . . | . P . . | * . * .
. * . . | * . * . | . P . .
. . . . | . . . . | * . * .
. . . . | . . . . | . . . .
Input-Output
Als Referenz wird das Beispielpuzzle von der Solitaire Chess-Webseite verwendet:
. . . .
. B . .
R P . .
. . . N
Die Lösung besteht darin, den Bauern mit dem Ritter zu nehmen, dann den Ritter mit dem Turm und schließlich den Bischof mit dem Turm.
Eingang
Die Eingabe muss in einer von drei Formen erfolgen. Sie können diejenige auswählen, die für Sie am bequemsten ist.
- Eine Zeichenfolge wie
.....B..RP.....N
, mit oder ohne Zeilenumbruch. Das Zeichen, das ein Leerzeichen darstellt, kann ein beliebiges Zeichen sein, von dem keines istKQRBNP
. - Eine Liste von Listen (oder eine abgeflachte Liste), in der die Elemente entweder Zeichen oder Zahlen sind, wie folgt:
[['.', '.', '.', '.'], ['.', 'B', '.', '.'], ['R', 'P', '.', '.'], ['.', '.', '.', 'N']]
oder[[0, 0, 0, 0], [0, 4, 0, 0], [3, 6, 0, 0], [0, 0, 0, 5]]
. Für die erstere kann das Zeichen, das eine Leerstelle darstellt, alles sein, was nicht dazu gehörtKQRBNP
. Für letztere habe ich den Stücken die Nummer gegeben, die ihrem Rang in meiner früheren Zugliste entspricht (1
ist ein König,4
ist ein Bischof,6
ist ein Bauer usw.). Sie können die Nummerierung ändern. - Eine Liste von Koordinaten , wobei jedes Element die Form hat
[x, y, 'c']
, wie folgt:[[1, 2, 'B'], [0, 1, 'R'], [1, 1, 'P'], [3, 0, 'N']]
.
Wenn Sie eines der listenbasierten Eingabeformate auswählen, können die Trennzeichen und Begrenzer sinnvolle und verständliche Zeichen sein.
Ausgabe
Die Ausgabe muss eine Folge von Zügen oder eine Folge von Board-Zuständen sein. Einige Rätsel haben mehr als eine Lösung. Sie können einen oder alle von ihnen ausgeben. Wenn Sie eine Folge von Platinenzuständen ausgeben möchten, muss jede Platine in einem der drei Eingabeformate mit einem angemessenen Trennzeichen (z. B. Zeilenvorschub) zwischen ihnen vorliegen.
Wenn Sie eine Folge von Zügen ausgeben möchten, müssen diese als eine Liste von Koordinatenpaaren ausgedrückt werden [[[3,0], [1,1]], [[0,1], [1,1]], [[1,1], [1,2]]]
. [0,0]
stellt die untere linke Ecke dar, und auch hier kann das Trennen und Abgrenzen von Zeichen eine sinnvolle Wahl sein.
Wenn eine bestimmte Karte nicht gelöst werden kann, geben Sie einen falschen Wert ( 0
, eine leere Zeichenfolge usw.) aus. Wenn eine bestimmte Tafel weniger als zwei Teile hat, ist das Verhalten undefiniert.
Testfälle
Hinweis: Die Ausgaben werden nur als eine Liste von Koordinatenpaaren angegeben, da die anderen Formate ziemlich einfach auf ihre Richtigkeit zu überprüfen sein sollten (und ich hatte keine Lust, alle möglichen Ausgabeformate auszutippen). Auch für die Rätsel, die mehr als eine Lösung haben, ist nur eine Möglichkeit vorgesehen.
Eingang 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']]
Ausgang 1:
[[[2,0], [1,1]], [[1,1], [3,3]]]
Eingang 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']]
Ausgang 2:
[[[3,0], [1,1]], [[0,1], [1,1]], [[1,1], [1,2]]]
Eingang 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']]
Ausgang 3:
[[[2,0], [3,1]], [[0,1], [1,3]], [[0,2], [1,3]], [[2,3], [1,3]], [[3,1], [1,3]]]
Eingang 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']]
Ausgang 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]]]
Eingang 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']]
Ausgang 5:
[[[0,3], [1,2]], [[1,2], [2,1]], [[2,1], [1,0]], [[1,0], [0,1]]]
Eingang 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']]
Ausgang 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]]]
Antworten:
Haskell,
226195191188 BytesGibt eine Liste aller Lösungen zurück. Jede Lösung ist eine Liste von Zügen. Gibt eine leere Liste zurück, wenn es keine Lösung gibt.
4 Bytes gespart Danke an Lynn.
Probieren Sie es online aus
Verwendung:
Ausgabe:
quelle
!
spart ein paar Bytes: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))]]
. Eine Liste von Lösungen, wobei eine Lösung eine Liste von Zügen ist, bei denen es sich um einen Zug handelt((x1,y1),(x2,y2))
.m"P"=[1]
Sollte es nicht 2 sein?Javascript (ES6),
372361358 BytesEs muss (noch) optimiert werden. Aber hier ist ein
erster2.3. Versuch.Ausgabeformat:
Beispiel:
quelle