Peg Solitaire ist ein beliebtes Spiel, das normalerweise alleine gespielt wird. Das Spiel besteht aus einer Reihe von Stiften und einem Brett, das in ein Gitter unterteilt ist - normalerweise ist das Brett nicht rechteckig, aber für diese Herausforderung werden wir dies annehmen.
Jeder gültige Zug ermöglicht es einem, einen einzelnen Stift zu entfernen, und das Ziel ist es, so zu spielen, dass nur ein einzelner Stift übrig bleibt. Jetzt muss eine gültige Bewegung in eine Richtung (Nord, Ost, Süd oder Ost) erfolgen und über einen Stift springen, der entfernt werden kann.
Beispiele
Lassen Sie .
leere Felder auf dem Brett sein und Zahlen sind Stifte. Bei der folgenden Bewegung wird 1
eines nach rechts verschoben und 2
vom Brett entfernt:
..... .....
.12.. -> ...1.
..... .....
Eine Bewegung muss immer über einen einzelnen Stift springen, daher ist Folgendes nicht gültig:
...... ......
.123.. -> ....1.
...... ......
Hier sind einige gültige Konfigurationen nach jeweils einem Zug:
...1... ...1... ..71... ..71...
.2.34.5 ---> .24...5 ---> .2....5 ---> ......5
.678... (4W) .678... (7N) .6.8... (2S) ...8...
....... ....... ....... .2.....
Herausforderung
Bei einer anfänglichen Kartenkonfiguration und einer anderen Konfiguration wird ausgegeben, ob die andere Konfiguration durch sukzessives Bewegen der Stifte wie oben beschrieben erreicht werden kann.
Regeln
- Die Eingabe erfolgt durch eine Matrix / Liste von Listen / ... von Werten, die einen leeren Raum (z. B. Null oder Falsch) oder Stifte (z. B. Nicht-Null oder Wahr) angeben.
- Sie können und annehmen
- Sie können true / ungleich Null verwenden, um Leerzeichen anzugeben, und umgekehrt, wenn dies hilfreich ist
- Die Ausgabe besteht aus zwei unterschiedlichen Werten (einer der Werte kann abweichen), die angeben, ob die Endkonfiguration erreicht werden kann (z. B. falsch / wahr ,
[]
/[list of moves]
..).
Testfälle
initial goal -> output
[[1,0,0],[1,1,0],[0,1,0]] [[0,0,0],[0,1,0],[1,1,0]] -> True
[[1,0,0],[1,1,0],[0,1,0]] [[0,0,1],[0,1,1],[0,0,0]] -> False
[[0,0,0],[1,0,0],[0,0,0]] [[0,0,0],[0,0,1],[0,0,0]] -> False
[[0,0,0],[1,1,0],[0,0,0]] [[0,0,0],[0,1,1],[0,0,0]] -> False
[[0,0,0,0],[1,1,1,0],[0,0,0,0]] [[0,0,0,0],[0,0,0,1],[0,0,0,0]] -> False
[[1,0,0],[1,1,0],[1,1,1],[1,1,1]] [[0,0,1],[0,1,0],[1,0,0],[0,0,1]] -> True
[[1,0,0],[1,1,0],[1,1,1],[1,1,1]] [[1,0,0],[0,0,0],[0,0,0],[0,0,0]] -> False
[[1,0,1,1],[1,1,0,0],[1,1,1,0],[1,0,1,0]] [[0,0,1,0],[1,0,0,0],[1,0,1,0],[1,0,0,1]] -> True
[[1,0,1,1],[1,1,0,0],[1,1,1,0],[1,0,1,0]] [[0,0,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]] -> False
[[1,0,0,0],[1,1,0,0],[1,1,1,0],[1,0,1,0]] [[0,0,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]] -> True
[[0,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,0]] [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,1]] -> False
[[0,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,0]] [[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] -> False
[[0,0,0,1,0,0,0],[0,1,0,1,1,0,1],[0,1,1,1,0,0,0],[0,0,0,0,0,0,0]] [[0,0,0,1,0,0,0],[0,1,0,1,1,0,1],[0,1,1,1,0,0,0],[0,0,0,0,0,0,0]] -> True
[[0,0,0,1,0,0,0],[0,1,0,1,1,0,1],[0,1,1,1,0,0,0],[0,0,0,0,0,0,0]] [[0,0,0,1,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]] -> True
[[0,0,1,1,1,0,0],[0,0,1,1,1,0,0],[1,1,1,1,1,1,1],[1,1,1,0,1,1,1],[1,1,1,1,1,1,1],[0,0,1,1,1,0,0],[0,0,1,1,1,0,0]] [[0,0,1,1,1,0,0],[0,0,1,1,1,0,0],[1,1,1,1,1,1,1],[1,1,1,1,0,0,1],[1,1,1,1,1,1,1],[0,0,1,1,1,0,0],[0,0,1,1,1,0,0]] -> True
[[0,0,1,1,1,0,0],[0,0,1,1,1,0,0],[1,1,1,1,1,1,1],[1,1,1,0,1,1,1],[1,1,1,1,1,1,1],[0,0,1,1,1,0,0],[0,0,1,1,1,0,0]] [[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,1,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]] -> True
7
in Ihrem Beispiel mit Peg passiert ? Warum verschwindet es nach dem2
Umzug nach Süden?Antworten:
JavaScript (ES6),
184 178173 Bytes(initial_board)(target_board)
Probieren Sie es online aus!
(Die letzten beiden Testfälle wurden entfernt, die für TIO zu lange dauern.)
Kommentiert
quelle
Sauber , 232 Bytes
Probieren Sie es online aus!
Dies ist eine der seltenen Situationen, in denen ich Komposition und Curry verwenden kann, während ich Bytes speichere.
Erklärt:
@ :: [Int] -> [[Int]]
ist eine Hilfsfunktion, mit der die verschiedenen potenziellen neuen Zeilen / Spalten generiert werden , die sich aus einer Verschiebung ergeben können. Es vermeidet Spezialfall um[1,1,0:_]
damit zu bemerkena*b-c>0
nur , wenn[a,b,c]=[1,1,0]
und sotake(a*b-c)...
gibt ,[]
indem sie-1
oder0
Elemente für alle Konfigurationen , die keine gültige unterwegs sind.flip elem o...
kehrt die Reihenfolge der Argumente umelem
(macht "enthält x ein y" anstelle von "ist xa Mitglied von y") und wendet die anonyme Funktion aufc
das erste Argument an.\c=limit(iterate(nub o concatMap ...)[c])
generiert jedes potenzielle Board, das sich aus dem ergeben kann,c
indem der aktuelle Board-Satz mit allen Bewegungen, die auf allen Boards auftreten können, verbunden und die Duplikate entfernt werden, bis sich das Ergebnis nicht mehr ändert.\l=[l]++...
Stellt die Karte derl
Liste aller potenziellen neuen Karten in einem Abstand von einer Bewegung voran , die durch Anwenden@
auf die Reihen jeder Ausrichtung der Karte (0, 90, 180, 270-Grad-Drehung) und Ersetzen der entsprechenden geänderten Reihe durch die neue erzeugt wird Reihe.quelle