Chomp to gra dla dwóch graczy z układem prostokąta elementów. Każdy gracz wykonuje turę usuwając dowolny element, wraz ze wszystkimi elementami nad nim i po jego prawej stronie. Kto bierze lewy dolny kawałek, przegrywa. Dość łatwo można udowodnić, że pierwszy gracz zawsze ma ruch wygrywający (z wyjątkiem prostokąta 1 na 1); Znajdź to.
- Dane wejściowe to wymiary prostokąta (dwie liczby)
- Dane wyjściowe to lokalizacja zwycięskiego ruchu (dwie liczby)
- Jeśli jest więcej niż jeden wygrywający ruch, możesz wyprowadzić dowolny z nich.
To jest kod golfowy; najkrótszy kod (dowolny język) wygrywa.
Przykłady
Uwaga: Dane wyjściowe to tylko dwie liczby; Poniższa grafika ASCII ma jedynie na celu pokazanie, co oznaczają liczby.
Dane wejściowe: 5 3 (oparte na indeksach 1, zaczynając od lewego dolnego rogu)
Wyjście: 4 3
XXX--
XXXXX
XXXXX
Wejście: 4 4
Wyjście: 2 2
X---
X---
X---
XXXX
Premia
Odejmij 15 znaków od swojego wyniku, jeśli wypiszesz wszystkie zwycięskie ruchy. Każda para liczb musi być oddzielona nową linią.
Odpowiedzi:
GolfScript, 82 (
10897 znaków - 15 bonusów)Ponieważ nie znałem żadnej heurystyki, to rozwiązanie wykonuje wyczerpujące wyszukiwanie przestrzeni rozwiązania. Możesz wypróbować kod online . Chociaż implementacja jest bardzo wydajna, przestrzeń wyszukiwania rośnie bardzo szybko wraz ze wzrostem ilości danych wejściowych.
Przykłady:
Jak wspomniano powyżej, implementacja nie opiera się na rekurencji, ale odwiedza każdy węzeł przestrzeni wyszukiwania tylko raz. Poniżej znajduje się adnotowana wersja kodu, która bardziej szczegółowo opisuje bloki konstrukcyjne.
Reprezentacji pojedynczej płytce wielkości wag * h podaje się na liście w ilościach w zakresie od 0 do godz . Każda liczba podaje liczbę sztuk w odpowiedniej kolumnie. Tak więc poprawna konfiguracja to lista, na której liczby nie rosną od początku do końca (przy każdym ruchu upewniasz się, że wszystkie kolumny po prawej stronie są co najwyżej tak wysokie, jak wybrana).
źródło
Python
23, 141-15 = 126Wyszukiwanie minimalne metodą brute-force. Dla każdego możliwego ruchu rekursywnie sprawdzamy, czy przeciwnik może wygrać po tym ruchu. Dość słabo golfa; ktoś inny powinien być w stanie zrobić znacznie lepiej. To wydaje się być pracą dla APL.
win
jest interfejsem publicznym. Pobiera wymiary tablicy, konwertuje ją na reprezentację tablicy i przekazuje dow
.w
jest algorytmem minimax. Przyjmuje stan planszy, wypróbowuje wszystkie ruchy, buduje listę, której elementy odpowiadają zwycięskim ruchom, i zwraca True, jeśli lista jest pusta. Przy ustawieniu domyślnymf=print
budowanie listy powoduje efekt uboczny drukowania zwycięskich ruchów. Nazwa funkcji była bardziej sensowna, gdy zwróciła listę zwycięskich ruchów, ale potem przesunąłem jejnot
przód, aby zaoszczędzić miejsce.for r,p in enumerate(b)for c in xrange(p) if(r+c)
: Powtarzaj wszystkie możliwe ruchy.1 1
jest traktowany jako nielegalny ruch, co nieco upraszcza podstawową sprawę.b[:r]+[min(i,c)for i in b[r:]]
: Zbuduj stan planszy po ruchu reprezentowanym przez współrzędner
ic
.w(b[:r]+[min(i,c)for i in b[r:]],max)
: Ponownie sprawdź, czy nowy stan traci stan.max
to najkrótsza funkcja, jaką mogłem znaleźć, która wymagałaby dwóch liczb całkowitych i nie narzekałaby.f(r+1,c+1)
: Jeślif
jest drukowane, drukuje ruch. Cokolwiekf
to jest, generuje wartość wypełniającą długość listy.not [...]
:not
zwracaTrue
puste listy iFalse
niepuste.Oryginalny kod Pythona 2, całkowicie pozbawiony golfa, w tym zapamiętywanie do obsługi znacznie większych danych wejściowych:
Próbny:
źródło
13x13
wzięcia2x2
i wygrałbyś.Perl 6:
113108 znaków - 15 = 93 punktyTen był trudny! Oto wersja niebuforowanych który jest technicznie poprawne, ale zajmie bardzo dużo czasu wejść nietrywialnych.
Działa tak jak implementacja Pythona @ user2357112 (głosuj na niego / go, nie mógłbym tego rozgryźć bez jego / jej pracy!), Z wyjątkiem tego, że win () bierze tablicę Chomp (tablicę) zamiast szerokości i długości. Może być używany jak:
Wersja z zapamiętywaniem, która może obsługiwać przyzwoite dane wejściowe (choć nie zoptymalizowane pod kątem czytelności):
źródło