To koniec kolejnej dobrze rozgrywanej gry w szachy. Jesteś białym graczem i nadal masz wieżę i swojego króla. Twój przeciwnik ma tylko króla.
Ponieważ jesteś biały, twoja kolej. Utwórz program, aby zagrać w ten mecz w szachy. Jego rezultatem może być sekwencja ruchów, animacja gif, grafika ASCII lub cokolwiek zechcesz.
Wydaje się to dość oczywiste, ale stwierdzę to wprost: musisz wygrać grę (skończoną liczbą ruchów). Z tej pozycji zawsze można wygrać. NIE UTRACAJ TEGO ROOK. NIE STALEMATE.
Twój program może, ale nie musi, przyjmować ludzkie dane wejściowe dla pozycji początkowej i każdego czarnego ruchu (możesz bezpiecznie założyć, że jest to legalna pozycja, tzn. Królowie się nie dotykają). Jeśli nie, wystarczy losowa pozycja początkowa i losowe ruchy czarnego króla.
Wynik
Twój wynik będzie długości bajtu kodu + bonus. Dowolny język jest dozwolony, wygrywa najniższy wynik.
Premia
-50, jeśli twój program dopuszcza zarówno pozycję początkową zdefiniowaną przez człowieka, jak i losową. Ludzie mogą wejść do niego przez stdin, plik, GUI ...
-100, jeśli twój program pozwala zarówno ludzkiemu, jak i losowemu graczowi przenieść czarnego króla
+12345, jeśli polegasz na zewnętrznym rozwiązaniu szachowym lub wbudowanej bibliotece szachowej
Powodzenia!
Aktualizacja!
Dodatkowa zasada: mecz musi zostać rozegrany do mata. Czarny nie rezygnuje, nie wyskakuje z szachownicy i nie zostaje porwany przez kosmitów.
Wskazówka
Prawdopodobnie możesz uzyskać pomoc z tego pytania na stronie chess.se .
Odpowiedzi:
Haskell 1463–100 = 1363
Po prostu otrzymuję odpowiedź. Znajduje to rozwiązanie w sposób wsteczny, wracając od szacha do pozycji, w której się znajdujemy. Różni się to od opisu analizy wstecznej w programowaniu szachowym - zamiast zaczynać od zestawu początkowego i rozszerzać go o ruchy wstecz dopóki nie zostaną wyświetlone żadne przesunięte kwadraty, zaczyna się od wszystkich nieużywanych kwadratów i zmniejsza ten zestaw, próbując wykonać ruchy do przodu. Będzie to mniej czasochłonne niż tradycyjny sposób, ale użycie pamięci eksplodowało, gdy próbowałem.
Skompiluj z
ghc -O2
dla akceptowalnej wydajności do obliczeń tabeli końcowej; gra jest natychmiastowa po pierwszym ruchu. Zaopatruj białego króla, wieżę, czarne kwadraty króla jako argumenty. Dla ruchu chce tylko kwadratu i wybierze dla ciebie, jeśli naciśniesz return. Przykładowa sesja:Kod:
Edytowano: Naprawiono kod zapamiętujący tabelę gier końcowych i używający argumentów, więc o wiele mniej bolesne było powtarzanie testów.
źródło
y
). Jest to naprawdę oczywiste, ponieważ drugi ruch nie jest szybki, gdy rozważaliśmy już całą grę końcową. Dziś wieczorem idę do pubu, ale jeśli jutro dostanę szansę, sprawię, że będzie to mniej straszne.C, obecnie 2552 niekomentowanych znaków spoza białej przestrzeni
Liczenie wskazuje mi, że mógłbym zagrać w golfa poniżej 2552 znaków, ale biorąc pod uwagę, że jest już mniejsza odpowiedź (która będzie trudna do pokonania), zastanowię się nad tym ostrożnie, zanim się tym zajmę. To prawda, że jest około 200 znaków do wyświetlania tablicy, a kolejne 200 do sprawdzania danych wprowadzanych przez użytkownika zarówno pozycji początkowej, jak i ruchu (które potrzebuję do przetestowania, ale mogę je wyeliminować).
Nie ma tu drzewa gry, tylko zakodowany algorytm, więc porusza się natychmiast.
Pozycje początkowe są wprowadzane jako wiersz (1-8) kolumna (1-8) ponumerowana od prawej górnej części, a program działa na tym samym schemacie. Jeśli więc obrócisz ekran o 90 stopni w kierunku przeciwnym do ruchu wskazówek zegara, będzie on zgodny ze standardową notacją kwadratową w szachach korespondencyjnych. Pozycje, w których czarny król jest już pod kontrolą, są odrzucane jako nielegalne.
Czarne ruchy są wprowadzane jako liczby od 0 do 7, przy czym 0 oznacza ruch na północ, 1 na północny wschód i tak dalej, zgodnie z ruchem wskazówek zegara.
Nie postępuje zgodnie z powszechnie znanym algorytmem, który wykorzystuje wieżę wyłącznie pod ochroną białego króla, aby ograniczyć czarnego króla. Wież ogranicza czarnego króla tylko w sensie pionowym (i ucieknie poziomo, jeśli zostanie ścigany). Biały król ogranicza czarnego króla w ruchu poziomym. Oznacza to, że dwa białe elementy nie wchodzą sobie w drogę.
Wydaje mi się, że usunąłem większość błędów i możliwych nieskończonych pętli, teraz działa całkiem dobrze. Zagram jutro ponownie i zobaczę, czy jest coś jeszcze, co wymaga naprawy.
Oto typowe wykończenie (kolega może czasem wystąpić w dowolnym miejscu po prawej lub lewej krawędzi planszy).
źródło
Bash, 18 (lub -32?)
Dobra, to żartobliwa odpowiedź. Ponieważ czarny jest dobrym szachistą, a czarny wie, że biały jest również dobrym szachistą, postanawia, że jedyną rozsądną rzeczą jest:
Skutkuje to białym zwycięstwem, które spełnia specyfikację.
Technicznie możesz wprowadzić bieżące pozycje jako argumenty, program po prostu je ignoruje, więc prawdopodobnie kwalifikuje się to do premii -50.
źródło
1-0
który jest nieco krótszy.