Das Programm spielt weiß.
Beispiel stdin:
8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … … … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h
Beispiel stdout:
8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … ♙ … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ … ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h
Jeder gültige Zug ist in Ordnung. "En passant" und Rochade werden ignoriert. Es ist in Ordnung, Fehlermeldungen anzuzeigen oder nichts zu drucken, wenn keine gültige Verschiebung vorliegt.
Die Antwort mit den meisten Stimmen gewinnt.
popularity-contest
chess
Hristo Hristov
quelle
quelle
Antworten:
Ich beschwere mich nicht über Upvotes, aber um fair zu sein ... meine Lösung hier ist eigentlich gar nicht so toll. Ugoren ist besser, abgesehen von mangelnder Unicode-Unterstützung. Sehen Sie sich vor der Abstimmung unbedingt alle Antworten an, wenn Sie erst jetzt auf diese Frage gestoßen sind!
Wie auch immer.
Haskell, 893
888904952(ohne Rochade)862 (ohne Bauern-Doppelzüge)(Sie haben nicht angegeben, ob dies Code-Golf sein soll, aber es scheint mir, dass es sollte)
Wenn Sie GHC installiert haben (zum Beispiel als Teil der Haskell-Plattform ), können Sie dies einfach tun
quelle
C,
734672640 ZeichenZeichen werden ohne entfernbares Leerzeichen gezählt.
Das von mir verwendete Dateiformat entspricht nicht den Anforderungen, sondern vereinfachtem ASCII.
Ich muss Unicode-Zeichenunterstützung hinzufügen, es würde einige Zeichen kosten.
Eingabe- / Ausgabedateiformat:
Muss genau 8 Zeilen mit genau 8 Zeichen enthalten.
pnbrqk
werden für weiße Stücke,PNBRQK
für schwarze Stücke, Leerzeichen für Leerzeichen verwendet:Die Logik ist ganz einfach:
Versuchen Sie für jede mögliche Bewegung jedes weißen Stücks jede mögliche Bewegung jedes schwarzen Stücks.
Wenn kein schwarzer Zug den weißen König erfasst, ist der weiße Zug gültig.
Die Platine wird als
char[256]
16x16-Matrix behandelt, wobei nur die 8x8-Matrix oben links verwendet wird. Positionen und Bewegungsvektoren werden in 8-Bit-Ganzzahlen (x:4,y:4
) gehalten. Das zusätzliche Bit ermöglicht die Verwendung einer einfachen Arithmetik (new_pos = old_pos + steps*direction
) mit einer einfachen Erkennung der Platinenkante (&0x88
macht die Magie).r[]
codiert drei Dinge:'('+vector
.Funktionen:
main
liest die Tafel, wandelt Buchstaben in internen Code um, rufta
auf, um weiße Züge zu finden, druckt die Tafel.a
rekursiv Schleifen über die 64 Quadrate. Für jedes Stück der richtigen Farbe (Parameterc
) wird die Bewegungsregel für das Stück gefunden und aufgerufend
.d
rekursiv durchläuft die codierte Bewegungsregel, bei der es sich um eine Liste von Vektoren handelt, diee
jeweils aufgerufen werden. Es gibte
die ursprüngliche Position, den Vektor und die Bereichsgrenze an (7 für Steine über B, 2 für Bauern zweiten Ranges, 1 ansonsten).e
testet alle Bewegungen entlang eines Vektors. Wenn der Zug möglich ist (dh Bauern bewegen sich vorwärts, innerhalb des Bretts, nicht blockiert, Bauern diagonal gefangen), überprüft eines von zwei Dingen. Läuft bei weißen Zügen,v
um den Zug zu validieren. Überprüft bei schwarzen Zügen, ob der weiße König gefangen ist. Wenn dies zutrifft, wird der Zug auf dem Brett gespielt.v
validiert einen weißen Zug. Es kopiert das Board beiseite, führt den zu testenden Zug aus und rufta
erneut auf, um nach schwarzen Zügen zu suchen.quelle
Python 2.6,
886- 1425 ZeichenMeine ursprüngliche Version (in den Revisionen) hatte 886 Zeichen, erfüllte die Spezifikation jedoch nicht vollständig (sie überprüfte nicht, ob Schachmatt vermieden wurde; sie berücksichtigte nicht einmal die möglichen Bewegungen der schwarzen Teile).
Jetzt ist es so (und ich habe mehrere Fehler im Original behoben). Leider ist dies mit Kosten in Zeichen verbunden: 1425 für den Moment, aber es sollte noch wenig Raum für Verbesserungen geben. Diese Version sollte im Umgang mit Randfällen viel solider sein als die vorherige.
Beispiel für Ein- und Ausgabe:
quelle