Atomschach ist eine (sehr unterhaltsame) Variante des Schachs, bei der jede Erfassung eine "Explosion" verursacht und die erfasste Figur, die erfassende Figur und alle Nicht-Bauern in einem Radius von 1 Quadratmeter zerstört. Ziel dieser Herausforderung ist es nicht, eine ganze Partie Atomschach zu spielen, sondern lediglich zu simulieren, was passiert, wenn ein bestimmter Zug ausgeführt wird.
Haftungsausschluss: Explosionseffekte nicht enthalten.
Eingang
Die Brettposition wird in der Forsyth-Edwards-Notation (allgemein als FEN bekannt) angegeben, jedoch nur mit dem ersten Feld. Zum Beispiel eine Eingabe von:
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
repräsentiert die Startposition:
Dies muss als Zeichenfolge oder als Entsprechung Ihrer Sprache verstanden werden. Es ist garantiert gültig; Zum Beispiel müssen Sie sich nicht darum kümmern, ob es zehn Könige gibt oder ob es überhaupt keinen König gibt.
Sie erhalten auch den Zug, den Sie simulieren möchten, der als zwei quadratische Namen dargestellt wird: das Quadrat, auf dem sich das zu bewegende Teil befindet, und das Quadrat, auf das es sich bewegt. Wenn Sie beispielsweise den Bauern des Königs auf dem obigen Bild um zwei Felder nach vorne bewegen, wird dies folgendermaßen dargestellt:
e2e4
Dies muss auch als String verstanden werden. Der Zug ist immer gültig und Sie müssen die Rochade nicht unterstützen . Sie müssen en passant unterstützen , was im nächsten Abschnitt näher erläutert wird.
Ausgabe
Die Ausgabe Ihres Programms sollte in derselben Partial-FEN-Notation wie die Eingabe erfolgen, wobei der angegebene Zug ausgeführt wird (und ggf. explodierte Teile).
Die genauen Regeln für Explosionen lauten:
Entfernen Sie das zu erfassende Stück (dies ist immer das Stück auf dem zweiten Feld, das in der Eingabe angegeben ist, außer wenn die Erfassung ein en passant ist ).
Entfernen Sie das Teil, das die Erfassung vornimmt (dies ist immer das Teil auf dem ersten Feld, das in der Eingabe angegeben ist).
Entfernen Sie jedes Stück, das ist:
Befindet sich auf einem der 8 Felder, die das Feld umgeben, auf dem die Eroberung stattgefunden hat (für en passant ist dies das Feld, auf dem sich die Eroberungsfigur befinden würde, wenn sie nicht explodieren würde).
kein Bauer.
Schneller Überblick über die en passant- Regeln für diejenigen, die nicht vertraut sind: Wenn ein Bauer zwei Felder vor seinem Startrang steht und es einen Bauern gibt, der ihn hätte erobern können, wenn er sich nur um ein Feld vorwärts bewegt hätte, kann er ihn trotzdem erobern, aber erst im nachhinein. Diese Erfassung soll " im Vorbeigehen " erfolgen (oder auf Französisch: " en passant ").
Testfälle
In den Bildern stellen die grünen Pfeile die bevorstehende Bewegung dar, und die grünen Kreise stellen explodierte Teile dar.
Input: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
, g1f3
Output:rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R
Input: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P1pP/2rP1P2/R1B3RK
, f2g3
Output: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P2P/2rP4/R1B3RK
(gestohlene aus http://en.lichess.org/ocoSfS5I/white#36 )
Input: rnbqk1nr/1pp5/p2pp1pp/5p2/1bN5/2P1PQ1N/PP1P1PPP/R1B1KB1R
, f3b7
Output: 3qk1nr/2p5/p2pp1pp/5p2/1bN5/2P1P2N/PP1P1PPP/R1B1KB1R
(gestohlene aus http://en.lichess.org/NCUnA6LV/white#14 )
Input: rnbqk2r/pp2p2p/2p3pb/3pP3/5P2/2N5/PPPP2P1/R1BQKB1R
, e5d6
Output: rnbqk2r/pp2p2p/2p3pb/8/5P2/2N5/PPPP2P1/R1BQKB1R
(bestohlen http://en.lichess.org/AvgU4Skq/white#16 , das war nicht die eigentliche Bewegung, aber ich kann nicht gestört werden , um ein Atom Spiel zu finden , die tatsächlich hatte en passant: P)
Input: 5r2/2k5/p1B5/1pP1p3/1P4P1/3P4/P7/1K3R1q
, c6h1
Output: 5r2/2k5/p7/1pP1p3/1P4P1/3P4/P7/1K3R2
(gestohlene aus http://en.lichess.org/l77efXEb/white#58 )
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Antworten:
JavaScript ( ES6 ) 305
310 321Als eine Funktion mit 2 realen Parametern (und viel mehr mit Standardwerten, die als schnelle und schmutzige Methode zum Definieren von Einheimischen verwendet werden)
Teste das folgende Snippet (nur in EcmaScript 6, Firefox)
Ungolfed
quelle
Java, (
946777776 Zeichen)1 Zeichen dank @ edc65
Hinweis: Zeichen werden ohne Testfälle gezählt.
Code
Ich bin mir nicht sicher, ob diese Lösung optimal ist, aber ich arbeite daran, mehr Golf zu spielen. Vorschläge sind willkommen. Ich kann den gesamten Code auch kommentieren, wenn jemand möchte, aber ich denke, es ist größtenteils selbsterklärend, abgesehen von der verwirrenden Aufzählung der Variablen.
Erläuterung
Erweitert
Alt
quelle
String m,i="";m="";char[]n=m.toCharArray()
->String i=a[0];char[]n=a[1].toCharArray()
ist kürzer und so bekommt man die parameter von außen (wie man sowieso sollte )