Biorąc pod uwagę siatkę 8x8 liter reprezentujących aktualny stan gry w szachy, Twoim programem jest znalezienie następnego ruchu dla białych, który skutkuje matą (odpowiedź zawsze będzie wiązana w jednym ruchu).
Wejście
Dane wejściowe będą na STDIN - 8 linii po 8 znaków każdy. Znaczenie każdego znaku jest następujące:
K/k - king
Q/q - queen
B/b - bishop
N/n - knight
R/r - rook
P/p - pawn
- - empty square
Wielkie litery oznaczają białe elementy, a małe - czarny. Plansza zostanie ustawiona w taki sposób, że biel będzie odgrywać od dołu, a czerń od góry.
Wynik
Ruch dla bieli, który powoduje mat, w zapisie algebraicznym . Nie musisz notować, kiedy kawałek został zabrany, ani nie musisz się martwić rozróżnieniem dwóch identycznych elementów, które mogą wykonać ten sam ruch.
Przykładowe dane wejściowe
Przykład 1
Wejście:
------R-
--p-kp-p
-----n--
--PPK---
p----P-r
B-------
--------
--------
Wynik:
c6
Przykład 2
Wejście:
--b-r--r
ppq-kp-p
-np-pn-B
--------
---N----
--P----P
PP---PP-
R--QRBK-
Wynik:
Nf5
Przykład 3
Wejście:
---r-nr-
-pqb-p-k
pn--p-p-
R-------
--------
-P-B-N-P
-BP--PP-
---QR-K-
Wynik:
Rh5
Możesz założyć, że rozwiązanie nie będzie wiązało się z kastracją ani en-pasywacją.
To jest golf golfowy - wygrywa najkrótsze rozwiązanie.
(Przykłady zaczerpnięte z mateinone.com - puzzle 81, 82 i 83)
Odpowiedzi:
Rubinowy,
589512510499493 znakówDane wejściowe są podawane przez stdin, np .:
Wyjście to nie tylko jeden ruch, który zmusza partnera w jednym, ale każdy ruch, który to robi.
Edycja 1: Funkcja
e
została użyta tylko raz, więc ją wstawiłem. Po drugie, kodowanie opiera się teraz na liczbie 5 zamiast 10. A refaktoryzacja klonowania płytki pozwoliła zaoszczędzić sporo znaków.Edycja 2: Nadal nie tak wiele ulepszeń, jak chciałem. Zmiana skrótu z
{a=>b,c=>d}
naHash[a,b,c,d]
. Kosztuje to 4 znaki, ale oszczędza jeden na parę klucz-wartość.Edycja 3: Tylko drobne redukcje: wstawianie M (4 znaki),
t==?-
->t<?.
(2), usuwanie pionka w notacji algebraicznej na końcu (2), zamiana puts (3). Program ma teraz mniej niż 500 znaków.Edycja 4: Ciekawe, ile jeszcze można znaleźć w takim programie. Przeniesiono niezmiennik poza pętlę i znalazłem kolejne zdublowane obliczenie.
źródło
[*$<]
zamiast$<.map{|l|l}
.