Wenn Sie ein 8x8-Buchstabenraster haben, das den aktuellen Stand einer Schachpartie darstellt, besteht Ihre Aufgabe darin, einen nächsten Zug für Weiß zu finden, der zu einem Schachmatt führt (die Antwort wird immer ein Zug sein).
Eingang
Die Eingabe erfolgt in STDIN - 8 Zeilen mit jeweils 8 Zeichen. Die Bedeutungen der einzelnen Zeichen sind wie folgt:
K/k - king
Q/q - queen
B/b - bishop
N/n - knight
R/r - rook
P/p - pawn
- - empty square
Großbuchstaben stehen für weiße Teile und Kleinbuchstaben für Schwarz. Das Brett wird so ausgerichtet, dass Weiß von unten nach oben und Schwarz von oben nach unten spielt.
Ausgabe
Ein Zug für Weiß, der zu Schachmatt führt, in algebraischer Notation . Sie müssen weder notieren, wann ein Teil genommen wurde, noch müssen Sie sich Gedanken darüber machen, zwischen zwei identischen Teilen zu unterscheiden, die denselben Zug ausführen können.
Probeneingabe
Beispiel 1
Eingang:
------R-
--p-kp-p
-----n--
--PPK---
p----P-r
B-------
--------
--------
Ausgabe:
c6
Beispiel 2
Eingang:
--b-r--r
ppq-kp-p
-np-pn-B
--------
---N----
--P----P
PP---PP-
R--QRBK-
Ausgabe:
Nf5
Beispiel 3
Eingang:
---r-nr-
-pqb-p-k
pn--p-p-
R-------
--------
-P-B-N-P
-BP--PP-
---QR-K-
Ausgabe:
Rh5
Sie können davon ausgehen, dass die Lösung nicht mit Rochade oder En-Passant einhergeht.
Das ist Code-Golf - die kürzeste Lösung gewinnt.
(Beispiele aus mateinone.com - Rätsel 81, 82 und 83)
Antworten:
Ruby,
589512510499493 ZeichenDie Eingabe erfolgt über stdin, zB:
Die Ausgabe ist nicht nur eine Bewegung, die einen Partner zwingt, sondern jede Bewegung, die dies tut.
Edit 1: Die Funktion
e
wurde nur einmal verwendet, also habe ich sie eingefügt. Zweitens basiert die Codierung jetzt auf Nummer 5 statt auf 10. Durch das Refactoring des Boards konnten einige Zeichen eingespart werden.Edit 2: Immer noch nicht so viel Verbesserung wie ich wollte. Ändern des Hash von
{a=>b,c=>d}
nachHash[a,b,c,d]
. Dies kostet 4 Zeichen, spart jedoch eines pro Schlüssel-Wert-Paar.Edit 3: Nur geringfügige Verkleinerungen: Inlining M (4 Zeichen),
t==?-
->t<?.
(2), Entfernen von Pawn in algebraischer Notation am Ende (2), Ersetzte Puts (3). Das Programm hat jetzt weniger als 500 Zeichen.Edit 4: Es ist interessant, wie viel man noch in einem solchen Programm finden kann. Eine Invariante außerhalb der Schleife verschoben und eine weitere doppelte Berechnung gefunden.
quelle
[*$<]
anstelle von verwenden$<.map{|l|l}
.