Oto interesujący problem, o którym myślałem o innym dniu, który polega na tym, że fragmenty kodu konkurują z innymi fragmentami kodu nie tylko we właściwości, którą posiada kod, ale poprzez grę z innymi bitami kodu.
Twoim zadaniem jest zbudowanie programu, który przyjmuje bieżący stan planszy Go i określa, jaki ruch wykonać lub przekazać.
Twój program zaakceptuje następujące dane wejściowe:
19 linii, każda po 19 znaków, reprezentujących elementy znajdujące się obecnie na planszy Go. Znak
0
reprezentuje pusty kwadrat,1
jest czarny i2
jest biały.Dwie liczby reprezentujące liczbę elementów więźnia każdego gracza (czarny, potem biały).
Jedna liczba reprezentująca, której tury ma się poruszyć (czarna lub biała). Jak wyżej,
1
jest czarny i2
jest biały.
i wyślij jedną z następujących opcji:
Para współrzędnych
a b
reprezentujących współrzędne, w których należy się poruszać.1 1
to lewy górny kwadrat, a pierwsza i druga cyfra oznaczają odpowiednio ruch w dół i w prawo.Ciąg
pass
, który reprezentuje ruch do przejścia.
Na przykład program może otrzymać następujące dane wejściowe:
0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000000000000000000
0001210000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
0 0 1
która reprezentuje grę, w której wykonano tylko kilka ruchów.
Wtedy program może wypisać 6 5
, co oznacza „umieść czarny kamień na punkcie 6 od góry i 5 od lewej”. To uchwyciłoby biały kamień w 7 5
. Stan tablicy zmieni się wtedy na:
0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000100000000000000
0001010000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
1 0 2
(Pamiętaj, że chociaż schwytano biały kamień, liczy się jako więzień dla czarnych).
Twój kod musi dodatkowo spełniać następujące właściwości:
Jeśli program ma ten sam stan wejściowy, musi zawsze generować to samo wyjście. To jest determinizm Go AI. Nie może zawierać elementu losowego.
Twój program nie może zająć więcej niż około 60 sekund, aby ustalić, jaki ruch wykonać. Zasada ta nie będzie ściśle stosowana ze względu na różnice w mocy obliczeniowej, ale musi wykonać ruch w rozsądnym czasie.
Kod źródłowy programu nie może przekraczać łącznie 1 megabajta (1 048 576 bajtów).
Twój program musi zawsze dokonywać legalnych ruchów. Twój program nie może wykonać ruchu w miejscu, w którym kamień już istnieje, i nie może umieścić elementu, który spowodowałby złapanie grupy jego własnych kamieni. (Jednym wyjątkiem od zasad na potrzeby tego wyzwania jest to, że program może utworzyć pozycję, która pierwotnie tam była - ponieważ jest podany tylko bieżąca pozycja planszy, nie można oczekiwać, aby zapamiętać, które ruchy zostały wykonane przed.)
Twoje zgłoszenie zostanie następnie rozegrane w turnieju all-play-all przeciwko wszystkim innym zgłoszeniom, w grze Go, w której stan planszy zaczyna się jako pusty, a każdy program na zmianę jest karmiony pozycją planszy i wykonuje ruch .
Każda para zgłoszeń rozegra dwie rundy - jedną rundę, przy czym każdy gracz jest czarny. Ponieważ AI występujące w tym problemie są całkowicie deterministyczne, dwie takie same gry AI zawsze będą skutkowały dokładnie taką samą grą.
Warunki wygranej są następujące:
Jeśli twój program gra do końca gry, do ustalenia zwycięzcy zostaną użyte chińskie reguły punktacji Go. Nie zostaną zastosowane żadne komi.
Jeśli Twój program odtworzy się do tego stopnia, że osiągnięty zostanie wcześniejszy stan, powodując nieskończoną pętlę, oba programy zostaną uznane za powiązane.
Twoje zgłoszenie zostanie ocenione na podstawie liczby punktów uzyskanych w porównaniu z innymi zgłoszeniami. Wygrana jest warta 1 punkt, a remis jest warty pół punktu. Zgłoszenie z największą liczbą punktów jest zwycięzcą ogólnym.
Jest to wyzwanie na szczycie wzgórza, w którym każdy może opublikować nowy wpis w dowolnym momencie, a wyniki będą okresowo ponownie oceniane, gdy to nastąpi.
źródło
Odpowiedzi:
Oto mój wpis, aby rozpocząć to wyzwanie od podstaw. Kod Python:
Zgodnie z twoimi zasadami zawsze gra „pass” jest prawidłową (choć złą) strategią.
źródło
Java: Wybierz miejsce, dowolne miejsce
Po prostu wybiera miejsca na planszy, aby sprawdzić ważność. Używa PRNG, ale z ustawionym ziarnem, więc jest to deterministyczne. Wykorzystuje różne fragmenty cyklu PRNG w zależności od liczby minionych zwojów.
Dla każdego stanowiska kandydata sprawdza, czy jest to prawidłowy ruch (ale nie jest to mądry ruch). Jeśli nie jest, przechodzi do następnego kandydata. Jeśli nie uda się znaleźć prawidłowego ruchu po 1000 próbach, przechodzi.
źródło
Some Scala:
Po przeczytaniu Wikipedii myślę, że pobije to obecne rozwiązanie.
źródło
1 1
ipass
).1 1
, ponieważ program jest zawsze uruchamiany od nowa za każdym razem, gdy zmienia się płyta.Jawa
Wybiera pierwszą pustą przestrzeń. Wygrywa z którąkolwiek z AI w momencie publikacji.
źródło
1 1
zostałby schwytany przez białą (teraz pustą) i nie może być zagrany przez czarną w następnej turze.