Twoim celem jest napisanie idealnego gracza do gry Wythoff's Nim .
Zasady Nim Wythoffa
Wythoff's Nim to deterministyczna gra dla dwóch graczy, rozgrywana dwoma stosami identycznych znaczników. Gracze naprzemiennie tury, w których wykonują jedną z następujących czynności:
- Usuń jeden lub więcej znaczników z pierwszego stosu
- Usuń jeden lub więcej żetonów z drugiego stosu
- Usuń taką samą liczbę liczników (jeden lub więcej), zarówno z pierwszego stosu, jak i drugiego stosu.
Oczywiście stosy nie mogą być ujemne, ale mogą osiągnąć wartość 0. Niezależnie od tego, który gracz usunie ostatni licznik, wygrywa grę.
Dla bardziej nastawionych geometrycznie, oto ekwiwalent gry, w którą możesz grać za pomocą tego apletu . Jedna królowa zaczyna na jakimś kwadracie nieskończonej szachownicy, której róg znajduje się w lewym dolnym rogu. Gracze naprzemiennie poruszają królową, która porusza się jak królowa szachów, ale ogranicza się do trzech kierunków:
- Na dół
- Lewo
- Po przekątnej w dół i w lewo
Kto przenosi królową do rogu, wygrywa.
Przypisując współrzędne królowej (z rogiem (0,0)
) do rozmiarów odpowiednich stosów, łatwo jest zauważyć, że obie gry są takie same.
Idealna gra
(Możesz to pominąć, jeśli znasz pojęcia doskonałej gry i zwycięskich ruchów.)
Ponieważ Wythoff's Nim jest skończoną i deterministyczną grą, ma idealną grę . Idealny gracz to strategia, która zawsze wygrywa z teoretycznie wygranej pozycji, co oznacza pozycję, w której istnieje strategia gwarantująca zwycięstwo.
Aby być zwycięską strategią, wystarczy przejść, aby zawsze przejść do teoretycznej zwycięskiej pozycji dla gracza, który właśnie się poruszył, a tym samym gracza, który nie pójdzie dalej. Pierwsze z tych zwycięskich pozycji (zwane również pozycjami zimnymi ) to (0,0), (1,2), (2,1), (3,5), (5,3)
. Zobacz artykuł w Wikipedii, aby uzyskać wyjaśnienie algorytmu znajdowania zwycięskiej strategii dla Wythoffa Nima, a także formułę generowania zwycięskich pozycji.
Wymagania programu
Napisz program lub funkcję przyjmuje pozycję jako dane wejściowe i wyprowadza zwycięski ruch w postaci pozycji po tym ruchu. Wygrywa najmniej bajtów.
Jeśli nie ma żadnego wygrywającego ruchu, tj. Pozycja jest teoretyczną stratą, Twój program powinien to zaznaczyć i przepadnąć.
Twój program musi zostać uruchomiony w rozsądnym czasie. Zatem wykładnicze rekurencyjne wyszukiwanie drzewa gry nie wystarczy. Jeśli chcesz wstępnie obliczyć i zaprogramować strategię, nie ma sprawy.
Wejście
Para (i,j)
liczb nieujemnych reprezentujących rozmiary stosów, każda najwyżej 99
. Mogą to być dwie liczby, krotka, lista lub dowolny inny kontener.
Wynik
Wydrukuj lub wyślij pozycję po swoim ruchu, ponownie jako dwie liczby lub ich pojemnik. To musi być legalne przejście do zwycięskiej pozycji. Jeśli jest wiele takich ruchów, każdy jest w porządku, ale tylko jeden.
Jeśli nie ma zwycięskiego ruchu, musisz to wskazać w wynikach. Wszelkie wyjścia jak False
, None
, 0, lub (-1,-1)
zrobi, tak długo jak nie jest to sytuacja prawna, i jest taka sama dla każdego wejścia przegranej.
Przykład działa
f(5,0) = (0,0)
f(2,2) = (1,2) # Or (2,1) or (0,0)
f(1,2) = False
f(13,9) = (13,8) # Or (10,6)
f(10,6) = False
f(5,10) = (5,3)
f(25,30) = (8,13)