tło
Widmo ( M achine e ducable N oughts ND C Rosses e ngine) jest prymitywny algorytmiczne płytkie maszyna do zera gier i przecięcie, utworzonych przez brytyjskiego komputer naukowca Donald MICHIE w 1960 roku. Pierwotnie został zaimplementowany z 304 pudełkami zapałek, każdy oznaczony pozycją planszy i zawierający kolorowe koraliki (jeden z dziewięciu kolorów, reprezentujący możliwe ruchy). Michie obliczyła, że te 304 pudełka zapałek wystarczały na każdą kombinację ruchów na planszy.
Bardziej matematyczni mogą zdawać sobie sprawę z tego, że na planszy N&C istnieje 19 683 możliwych kombinacji kółko, krzyżyk i puste miejsce; Jednak obliczył sposoby na zmniejszenie tej liczby (aby przyspieszyć algorytm i prawdopodobnie obniżyć pudełka zapałek!). Po pierwsze, usunął wszystkie niemożliwe ruchy, takie jak:
-------
|X|0|X|
| |0| |
|X|X| |
-------
(dwa kółko i cztery krzyże)
Następnie skompensował obroty. Na przykład, jeśli na pudełku zapałek widzimy:
-------
| |0|0|
|X| |X|
| |0| |
-------
możemy użyć tego samego pudełka dla
-------
| |X| |
|0| |0|
| |X|0|
-------
Dlatego wyżej wspomniane kolorowe koraliki reprezentują pozycje względne, a nie absolutne. Na przykład, jeśli powiedzieliśmy, że czerwony koralik oznacza lewy górny róg, wtedy spojrzymy na obraz na górze pudełka i zobaczymy:
-------
| |0|0|
|X| |X|
| |0| |
-------
wiedzielibyśmy, że w przypadku, gdy jest to tablica, czerwony koralik oznaczałby:
-------
|R|0|0|
|X| |X|
| |0| |
-------
Ale jeśli to jest plansza:
-------
| |X| |
|0| |0|
| |X|0|
-------
znaczyłby czerwony koralik
-------
| |X|R|
|0| |0|
| |X|0|
-------
Transformacje te zastosowano do obrotu i odwracania (we wszystkich kierunkach, w tym po przekątnej). Ponownie musisz zapisać każde pudełko zapałek tylko w ten sposób: nie twórz osobnych pudełek wirtualnych dla każdej transformacji!
Kolejnym uproszczeniem dokonanym przez Michie było upewnienie się, że komputer jest pierwszy. W ten sposób mógł usunąć wszystkie ruchy pierwszego poziomu, usuwając około jednej piątej pozostałych skrzynek. W końcu usunął wszystkie pola kończące grę (ponieważ na tych krokach nie była wymagana żadna „zawartość” ani ruchy).
Właśnie, teraz na samym algorytmie (to bardzo proste):
- Najpierw zdecyduj, co reprezentują kolory koralików. Będziesz potrzebował 9 kolorów, aby przedstawić każde z miejsc na planszy.
- Na początku gry każde z 304 pudełek zapałek zawiera koraliki. Chociaż koraliki mają losowy kolor (więc duplikaty są w porządku), powinny być możliwe ruchy (więc jeśli obraz stanu planszy przedstawia „O” w środkowym prawym rogu, nie możesz użyć koralika reprezentującego środek- dobrze).
- Za każdym razem, gdy nadchodzi kolej MENACE (X), znajdź pudełko zapałek z wydrukowaną na nim bieżącą pozycją planszy (lub jej transformacją).
- Otwórz pudełko zapałek i wybierz dowolny koralik tam losowo.
- Dowiedz się, w jaki sposób status tablicy został przekształcony, aby dostać się do obrazu na pudełku zapałek (np. Obrócony o 90 stopni w lewo). Następnie zastosuj tę transformację do koralika (np. Lewy górny staje się lewy lewy).
- Umieść X w tym kwadracie. Usuń wybrany koralik z pudełka zapałek. Jeśli w rezultacie pudełko pozostanie puste, umieść w nim trzy losowe (możliwe) koraliki i wybierz jeden z nich do ruchu.
- Powtarzaj 3-6, aż gra się zakończy.
- Jeśli MENACE wygrał grę, przejrzyj wszystkie pudełka zapałek, które zabrał MENACE. Następnie prześledzić, jakiego koloru koralik użył w tym ruchu. Umieść dwa tego koloru koralika w pudełku (tak, aby był oryginalny koralik + jeszcze jeden, zwiększając tym samym prawdopodobieństwo, że MENACE wykona ten ruch następnym razem, gdy osiągnie tę pozycję)
- Jeśli MENACE przegrał grę, nie rób nic ( nie wymieniaj wyjętych koralików).
- Jeśli MENACE narysowało grę, wymień koralik użyty w każdym z jego ruchów, ale nie dodawaj dodatkowego, aby pozostało ci to, co zacząłeś.
To pozostawia nam algorytm, który jest bardzo prosty, ale trudny do wdrożenia. To stanowi podstawę twojego wyzwania.
Jeśli nadal jesteś zdezorientowany, zobacz http://chalkdustmagazine.com/features/menace-machine-educable-noughts-crosses-engine/ - to właśnie przeczytałem, kiedy po raz pierwszy dowiedziałem się o tym algorytmie
Wyzwanie
Zagraj w kółko i krzyżyk na komputerze. Na każdym kroku wypisz zawartość wszystkich pudełek zapałek.
Wejścia
- Na początku programu liczba podająca liczbę gier, w które chcesz zagrać przeciwko MENACE
- Następnie, po pierwszej turze MENACE, wpisujesz swój ruch jako ciąg dwóch znaków, pierwszą literą jest „L”, „R” lub „M” (lewa, prawa lub środkowa) odnoszące się do osi Y. Następnie wprowadź inną literę (ponownie „L”, „R” lub „M”), tym razem odnoszącą się do osi X. Powtórz dla wszystkich ruchów i gier.
Wyjścia
- Na początku każdej nowej gry wpisz „nowa gra”.
- Po każdym ruchu gracza, wyjmij planszę w dowolnym rozsądnym formacie. Nie musi wyglądać ładnie (np. Tablice przedstawiające pozycje planszy są w porządku).
- Po każdym ruchu gracza, MENACE powinien wykonać ruch. Wyjmij planszę po ruchu MENACE
- Po każdej grze wypisz zawartość wszystkich 304 pudełek zapałek. Koraliki mogą być reprezentowane przez literę, nazwę koloru, znak lub dowolny ciąg lub liczbę całkowitą, którą lubisz (bez wskaźników, anonimowych funkcji itp.).
Zasady
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
- Muszę być w stanie wprowadzać ruchy po zobaczeniu odpowiedzi MENACE. Nie „przekaż wszystkich ruchów do tej funkcji i zobacz, jak gra się rozgrywa”.
- Plansza musi być wyczyszczona między grami.
- Pudełka zapałek nie mogą być czyszczone między grami (spowoduje to zresetowanie uczenia maszynowego)
- Musisz mieć 304 pudełka zapałek. Każdy może zaimplementować ten algorytm we wszystkich 19683 pudełkach zapałek, ale nauka jest powolna (ponieważ wymaga wielu gier, aby uzyskać wszystkie z przydatnymi treściami).
- Dane wyjściowe mogą być w dowolnym rozsądnym formacie, a dane wejściowe można pobierać zgodnie ze standardami PPCG (o ile jest to zgodne z regułą 2). Jeśli musisz zmienić format wejściowy (zgodnie z opisem w sekcji „ Wejście ”), to jest OK, o ile ma to sens.
- Gra kończy się, gdy gracz wygrywa (zdobywając trzy z rzędu po przekątnej, w poziomie lub w pionie) lub gdy jest remis (plansza jest pełna i nie ma zwycięzcy)
- Podczas gdy MENACE musi wykonywać możliwe ruchy (i mieć tylko możliwe koraliki wewnątrz każdego pudełka zapałek), ze względu na wyzwanie nie musisz sprawdzać poprawności wkładu użytkownika. Jeśli wpiszesz coś złego, twój program może zrobić cokolwiek (całkowicie zwariować, wyrzucić błąd itp.) - możesz założyć, że dane wejściowe są prawidłowe.
źródło
[[0, 2, 6], [4, 8, 4, 3, 3], [7, 7, 7, 7, 7, 7, 7, 8], [1], ... [3, 3, 5, 4]]
.Odpowiedzi:
R , 839 bajtów
Wypróbuj online!
Dość długa odpowiedź, ale nie było to proste wyzwanie. Link TIO tutaj zawiedzie, ponieważ oczekuje interaktywnego wejścia. Oto wersja, która gra przeciwko drugiemu losowemu graczowi, który wybiera losowo miejsce. Wynik dla tej drugiej wersji jest tylko zwycięzcą (1, 2 lub 0 w przypadku remisu). Pudełka zapałek są inicjowane dla wszystkich pozycji na planszy, ale są używane tylko dla 304 zgodnie ze specyfikacją. Są one realizowane jako kopie planszy z liczbami ujemnymi, aby wskazać liczbę perełek na każdej pozycji. Eksperymentowałem z listą wektorów według oryginalnej specyfikacji, ale była mniej intuicyjna.
Jest to wersja mniej golfowa z komentarzami (ale wciąż krótkimi nazwami zmiennych). Pamiętaj, że nie wypisuje pudełka zapałek, ponieważ są one bardzo długie. Może zaimplementować interaktywnego gracza 2, losowego gracza 2 lub tę samą strategię matchbox dla gracza 2.
źródło