Napisz program w wybranym języku, który gra idealną grę w kółko i krzyżyk na planszy 3 * 3 przeciwko ludzkiemu graczowi. Jednak każdy ruch musi być innym programem , wygenerowanym z poprzedniej iteracji.
To, jak iw jakiej formie oceniasz wkład człowieka, zależy od ciebie, ale należy go odczytać ze standardowego wkładu. Podobnie, masz swobodę wyboru metody, w jaki sposób ustalisz, który gracz zacznie (na przykład najpierw pytasz lub pozwalasz człowiekowi wprowadzić nieprawidłowy ruch, aby zasygnalizować uruchomienie komputera lub inne pomysły).
Sprawdzanie poprawności ruchów nie jest konieczne, możesz założyć uczciwego przeciwnika.
Zasadniczo masz program, który odpowiada stanowi płyty. Stan jest drukowany w dowolny rozpoznawalny sposób, ale oczekuje się co najmniej następującego poziomu szczegółowości:
X..
00X
x..
Po tym, jak ludzki gracz wprowadzi swoje ruchy, twój program musi wygenerować następną iterację jako plik źródłowy w tym samym języku (na standardowe wyjście lub do pliku) i zakończyć. Nie wolno przechowywać informacji w żadnym innym miejscu poza tym plikiem źródłowym. (nie jest konieczne, aby Twój program skompilował i uruchomił wygenerowany program, może to zrobić użytkownik - jednak nie jest to zabronione). Po wygenerowaniu i uruchomieniu wygenerowanego programu będzie on zachowywać się podobnie, wyświetlać stan, czekać na dane wejściowe użytkownika itp.
Pod koniec gry musisz wydrukować wynik (niezależnie od tego, czy wygrałeś, czy remis) w jakikolwiek jednoznaczny sposób.
Przez idealną grę mam na myśli, że program nie może przegrać, a jeśli istnieje możliwość wymuszenia wygranej, powinien wygrać.
Wygrywa najkrótszy kod , zwycięzca jest wybierany co najmniej 10 dni po pierwszym ważnym wpisie.
Otrzymasz 10% obniżkę wyniku, jeśli twój program poradzi sobie z budową i uruchomieniem kolejnej iteracji. (Wiem, najprawdopodobniej nie warto) Oczywiście sam program musi zostać zakończony do czasu, gdy następna iteracja zaakceptuje ruchy użytkownika.
Jeśli używasz dziwnych, nietypowych sztuczek, opublikuj krótkie wyjaśnienie ze swoim kodem.
Odpowiedzi:
Perl, 933 znaków
Należy pamiętać, że pusta linia pośrodku skryptu faktycznie musi tam być. (Podziały linii na końcu długich linii nie są wymagane, z wyjątkiem czytelności, i nie są uwzględniane w liczbie znaków.)
Zastosowanie: Gdy program jest uruchamiany bez argumentów, wyświetla bieżący stan gry. Ponieważ na początku tablica jest pusta, wyjście będzie:
Uruchom program z argumentem od 1 do 9, aby przejąć ten kwadrat jako ruch. Program wykona własny ruch, a następnie wyśle skrypt zastępczy z nowym stanem. Zatem na przykład:
Tylko w pierwszej turze możesz wykonać ruch,
0
aby wskazać, że komputer powinien wykonać pierwszy ruch. Pamiętaj, że zawsze pierwszym graczem będzieX
.Po zakończeniu gry na wyświetlaczu pojawi się informacja na ten temat:
Program działa poprzez standardowe wyszukiwanie drzewa gry za pomocą minimax. (Kółko i krzyżyk to gra na tyle mała, że przy każdym uruchomieniu można wygenerować pełne drzewo gry). Wyjątkiem jest sytuacja, w której komputer porusza się pierwszy - w tym przypadku początkowe przejście do lewego górnego rogu jest trudne zakodowane.
Zauważ, że ten program działa w sposób zapewniający odpowiednią quine - w żadnym momencie skrypt nie uzyskuje dostępu do własnego pliku źródłowego w celu wygenerowania danych wyjściowych.
źródło