Program jest biały.
Przykład stdin:
8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … … … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h
Przykładowy stdout:
8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … ♙ … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ … ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h
Każdy prawidłowy ruch jest w porządku. „En passant” i castling są ignorowane. Można wyświetlać komunikaty o błędach lub nic nie drukować, jeśli nie ma prawidłowego przeniesienia.
Odpowiedź z największą liczbą głosów wygrywa.
popularity-contest
chess
Hristo Hristov
źródło
źródło
Odpowiedzi:
Nie narzekam na pozytywne opinie, ale szczerze mówiąc ... moje rozwiązanie tutaj nie jest wcale takie świetne. Ugoren jest lepszy, oprócz braku obsługi Unicode. Przed głosowaniem zapoznaj się z wszystkimi odpowiedziami, jeśli trafiłeś na to pytanie dopiero teraz!
Tak czy inaczej.
Haskell, 893
888904952(bez roszady)862 (bez podwójnych ruchów pionka)(Nie określiłeś, czy to ma być kod golfowy, ale wydaje mi się, że powinien)
Po zainstalowaniu GHC (na przykład w ramach platformy Haskell ) możesz to zrobić
źródło
C,
734672640 znakówZnaki liczone bez usuwalnej białej spacji.
Format pliku, którego użyłem, nie jest zgodny z żądaniem, ale uproszczony ASCII.
Muszę dodać obsługę znaków Unicode, kosztowałoby to trochę znaków.
Format pliku wejściowego / wyjściowego:
Musi mieć dokładnie 8 wierszy dokładnie 8 znaków.
pnbrqk
są używane do białych elementów,PNBRQK
do czarnych elementów, spacji dla przestrzeni:Logika jest dość prosta:
dla każdego możliwego ruchu każdego białego elementu wypróbuj każdy możliwy ruch każdego czarnego elementu.
Jeśli żaden czarny ruch nie schwyta białego króla, biały ruch jest ważny.
Płytka jest utrzymywana jako
char[256]
traktowana jako matryca 16 x 16, w której używany jest tylko lewy górny 8 x 8. Pozycje i wektory ruchu są przechowywane w 8-bitowych liczbach całkowitych (x:4,y:4
). Dodatkowy bit pozwala na użycie prostej arytmetyki (new_pos = old_pos + steps*direction
), z łatwym wykryciem krawędzi deski (&0x88
robi magię).r[]
koduje trzy rzeczy:'('+vector
.Funkcje:
main
czyta tablicę, konwertuje litery na wewnętrzny kod, wzywaa
do znalezienia białych ruchów, drukuje tablicę.a
rekurencyjnie zapętla się nad 64 kwadratami. Dla każdego elementu odpowiedniego koloru (parametruc
) znajduje regułę ruchu dla elementu i wywołujed
.d
rekurencyjnie zapętla się nad zakodowaną regułą ruchu, która jest listą wektorów wywołującyche
każdy z nich. Dajee
oryginalną pozycję, wektor i limit zasięgu (7 dla sztuk powyżej B, 2 dla pionków drugiej rangi, 1 w przeciwnym razie).e
testuje wszystkie ruchy wzdłuż wektora. Jeśli ruch jest możliwy (tj. Pionki poruszają się do przodu, w obrębie planszy, nie są blokowane, pionek chwyta po przekątnej), sprawdza jedną z dwóch rzeczy. W przypadku białych ruchów biegnie,v
aby potwierdzić ruch. W przypadku czarnych ruchów sprawdza, czy biały król został schwytany. Jeśli to prawda, ruch jest odtwarzany na planszy.v
zatwierdza biały ruch. Kopiuje planszę na bok, wykonuje ruch, aby przetestować, ia
ponownie wzywa , aby poszukać czarnych ruchów.źródło
Python 2.6,
886- 1425 znakówMoja początkowa wersja (w wersjach) pojawiła się przy 886 znakach, ale nie była w pełni zgodna ze specyfikacją (nie sprawdzała, czy można uniknąć matowania; nawet nie brała pod uwagę możliwych ruchów czarnych elementów).
Teraz tak jest (i poprawiłem kilka błędów w oryginale). Niestety wiąże się to z kosztem postaci: na razie 1425, ale wciąż powinno być niewiele miejsca na ulepszenia. Ta wersja powinna być o wiele bardziej solidna w obsłudze przypadków krawędzi niż poprzednia.
Przykładowe dane wejściowe i wyjściowe:
źródło