Völlig überrascht, dass dies nicht bereits veröffentlicht wurde, angesichts der großen Anzahl von Schachrätseln auf der Website. Während ich selbst darüber nachdachte, möchte ich Anush dafür danken, dass er es im März in den Sandkasten gestellt hat . Aber ich dachte, es ist lange genug her, dass ich weitermachen und es selbst tun könnte.
Ein Schachmatt ist eine Position, in der der König angegriffen wird und es keine Bewegung gibt, die ihn verteidigen kann. Wenn Sie nicht wissen, wie sich Schachfiguren bewegen, können Sie sich auf Wikipedia vertraut machen .
Die Herausforderung
Für diese Herausforderung wird Ihre Eingabe die Position eines Schachbretts in einer beliebigen Notation sein. Zur Verdeutlichung werden in Ihren Eingaben die Figuren auf einem Schachbrett mit ihren Farben und Positionen sowie gegebenenfalls das en passant erfasste Quadrat beschrieben. (Die Fähigkeit, ein Schloss zu erstellen, ist irrelevant, da Sie nicht außer Kontrolle geraten können .) Die FEN-Notation ist möglicherweise hilfreich , aber jedes geeignete Format ist in Ordnung. Der Einfachheit halber können Sie davon ausgehen, dass es sich um Schwarz handelt - dies bedeutet, dass Schwarz immer der Spieler mit dem Schachmatt ist. Eine Position, in der Weiß in Schach, Schachmatt oder Patt ist, wird für diese Herausforderung als ungültig betrachtet.
Sie müssen einen Wahrheitswert ausgeben, wenn die Position ein Schachmatt ist, und einen Falschwert, wenn dies nicht der Fall ist. Beachten Sie, dass Patt kein Schachmatt ist - der König muss angegriffen werden!
Wahrheitstestfälle
1k5R / 6R1 / 8/8/8/8/8 / 6K1 b - -
rn2r1k1 / pp1p1pQp / 3p4 / 1b1n4 / 1P2P3 / 2B5 / P5PP / R3K2R b - -
kr5R / rB6 / 8/8/8 / 5Q2 / 6K1 / R7 b - -
2K5 / 1B6 / 8/8/8 / 7N / R7 / R3r2k b - - 0 1
Falsche Testfälle
rnbqkbnr / pppppppp / 8/8 / 4P3 / 8 / PPPP1PPP / RNBQKBNR b KQkq -
8/8/8/8/8 / 1KQ5 / 4N3 / 1k6 b - -
2K5 / 1B6 / 8/8/8 / 7N / R7 / 4r2k b - -
8/8 / 2Q5 / 3k4 / 3Q5 / 8/8 / 7K b - -
8 / 4Q1R1 / R7 / 5k2 / 3pP3 / 5K2 / 8/8 b - e3 (Pass auf, dass en passant!)
Code Golf - kürzester Code in Bytes gewinnt. Viel Glück!
quelle
Antworten:
JavaScript (Node.js) ,
499 ... 374370 Bytes(b)(X)
Nachfolgend sind die erwarteten Werte für jedes Quadrat aufgeführt:
Probieren Sie es online!
Wie?
Vorstandsvertretung
Wir verwenden die klassische 0x88-Platinendarstellung , damit Zielquadrate , die außerhalb der Grenzen liegen, leicht erkannt werden können.
Codierung verschieben
Jeder Zugsatz ist mit 5 Parametern codiert:
Alle diese Parameter werden in eine einzelne Zeichenfolge gepackt. Zum Beispiel werden Ritterzüge wie folgt kodiert:
was gibt:
Alle Züge sind in der folgenden Tabelle zusammengefasst, mit Ausnahme von En-Passant-Erfassungen, die separat verarbeitet werden.
Kommentiert
quelle
8/1ppp4/1pkp4/8/2Q5/8/8/7K b - -
Haskell ,
116510651053 BytesDank Leo Tenenbaum gerettete Bytes
Probieren Sie es online!
Dies ist derzeit nicht gerade gut gelungen, aber es ist ein Anfang.Mit etwas Hilfe auf dem Weg habe ich jetzt ziemlich aggressiv Golf gespielt (und dabei einen Fehler behoben).Das vielleicht fragwürdige dabei ist, dass davon ausgegangen wird, dass Sie, anders als von einem König oder einem Bauern en passant, niemals außer Kontrolle geraten können, wenn Sie eines Ihrer eigenen Teile einfangen. Im Schach dürfen Sie diesen Zug nicht ausführen, aber mein Programm berücksichtigt diese Züge, um Bytes zu sparen, unter der Annahme, dass dies Sie niemals davon abbringen kann, wenn Sie in Schach sind.
Diese Annahme ist gültig, weil solche Bewegungen
Die Figur, die den König angreift, kann nicht gefangen werden, da die Figur, die sie gefangen hat, schwarz ist.
Der Weg der Figur, die den König angreift, kann nicht blockiert werden, da die gefangene schwarze Figur dies bereits getan hätte.
Wir fügen auch die zusätzliche Bedingung hinzu, dass Sie in Schach sind, wenn Sie keinen König haben.
Dieses Programm geht auch davon aus, dass wenn es einen Bauern gibt, der en passant gefangen werden kann, der Bauer der letzte Zug war und dieser Zug ein legaler Zug war. Dies liegt daran, dass das Programm nicht prüft, ob das Feld, auf das der schwarze Bauer bewegt wird, leer ist. Wenn also ein Teil vorhanden ist, kann es zu einem kleinen Durcheinander kommen. Dies kann jedoch nicht erreicht werden, wenn der letzte Zug ein legaler Zug war und darüber hinaus nicht in der FEN vertreten sein kann . Diese Annahme scheint also ziemlich solide zu sein.
Hier ist meine "ungolfed" Version als Referenz:
Probieren Sie es online!
quelle
guard x = [0|x]
und können Sie auch verwendenx?y=Just(x,y)
, um ein paar weitere Bytes zu speichern: 1129 BytesPython 3 (PyPy) , 729 Bytes
Probieren Sie es online!
quelle
8/2p5/Q7/Q2k4/Q7/8/8/7K b - -
(kein Schachmatt).