tło
Hex to abstrakcyjna gra strategiczna dla dwóch graczy, rozgrywana na K×K
rombie sześciokątnych płytek. Dwie przeciwne strony rombu są w kolorze białym, a pozostałe dwie czarne, a dwaj gracze, czarno-biały, umieszczają kolejno swój symbol koloru na niezajętym kafelku. Gracz, który jako pierwszy zdoła zbudować ścieżkę między przeciwnymi stronami swojego koloru, jest zwycięzcą. Wiadomo, że gra nie może zakończyć się remisem i że pierwszy gracz ma strategię wygraną niezależnie od wielkości planszy (szczegóły na stronie Wikipedii).
Zadanie
W tym wyzwaniu ustalamy rozmiar planszy na K = 4
i reprezentujemy planszę jako następującą siatkę. Grube linie oznaczają sąsiadujące płytki.
Twoim zadaniem jest opracowanie zwycięskiej strategii dla pierwszego gracza, którą możesz wybrać jako czarny lub biały. Oznacza to, że niezależnie od tego, jakie legalne ruchy wykona przeciwny gracz, twoja gra musi zakończyć się zwycięstwem. Twój wkład to pozycja w grze (układ żetonów na planszy), a twój wynik to legalny ruch, w formacie określonym poniżej. Jeśli chcesz sam znaleźć zwycięską strategię, nie czytaj tego spoilera:
Zarys jednej możliwej strategii wygranej, przy założeniu, że biały jest pierwszy. Najpierw wybierz 5. Następnie, jeśli masz ścieżkę od 5 do dolnego rzędu LUB czarny wybiera 0 lub 1 w dowolnym punkcie, odpowiedz, wybierając dowolną z 0 lub 1, która jest pusta. Jeśli czarny wybierze 9 lub 13, wybierz 10, a następnie którykolwiek z 14 lub 15 jest wolny. Jeśli czarny nie wybierze 9, 13 lub 14, wybierz 9, a następnie którykolwiek z 13 lub 14 jest wolny. Jeśli czarny wybierze 14, odpowiedz, wybierając 15. Następnie wybierz 10, jeśli jest wolny; jeśli czarny wybierze 10, odpowiedz 11. Jeśli czarny wybierze 6, odpowiedz 7, a następnie dowolna z 2 lub 3 jest pusta. Jeśli czarny nie wybierze 6, wybierz go, aby uzyskać ścieżkę od 5 do dolnego rzędu.
Wejście i wyjście
Twój wkład to ciąg 16 znaków WBE
, które oznaczają białe, czarne i puste. Reprezentują płytki planszy, jak wyliczono powyżej. Możesz wybrać metodę wprowadzania (która określa również metodę wyjściową) z następujących czynności:
- Wejście ze STDIN, wyjście do STDOUT.
- Wprowadź jako jeden argument wiersza poleceń, wyślij do STDOUT.
- Wprowadź jako 16 jednoznakowych argumentów wiersza poleceń, wyślij do STDOUT.
- Dane wejściowe jako argument funkcji o nazwie, dane wyjściowe jako wartość zwracana.
Twój wynik reprezentuje płytkę, na której umieszczasz następny żeton, ponieważ twoja kolej na ruch. Możesz wybrać jeden z następujących formatów wyjściowych:
- Indeks zerowy (jak na powyższym obrazku).
- Indeks oparty na jednym.
- Łańcuch wejściowy z jednym
E
zamienionym na którykolwiekW
lubB
wybrany przez gracza.
Zasady
Twoja strategia musi być deterministyczna. Nie musisz poprawnie obsługiwać pozycji w grze, które są nieosiągalne z pustej planszy za pomocą strategii, lub pozycji, które już wygrywają dla któregoś z graczy, i możesz się na nich upaść. I odwrotnie, na planszach, które są osiągalne dzięki twojej strategii, musisz zwrócić legalny ruch.
To jest golf golfowy, więc wygrywa najmniejsza liczba bajtów. Standardowe luki są niedozwolone.
Testowanie
Napisałem kontroler Python 3 do sprawdzania poprawności wpisów, ponieważ byłoby to bardzo żmudne robić ręcznie. Możesz go znaleźć tutaj . Obsługuje pierwsze trzy formaty wejściowe i funkcje Pythona 3 (funkcje w innych językach muszą być opakowane w programy), wszystkie trzy formaty wyjściowe i oba odtwarzacze. Jeśli strategia nie wygrywa, wyświetli znalezioną przegraną grę, abyś mógł ulepszyć swój program.
Incorrect response 'WWWWWWWWBBBBBBBB' to message 'WWWWWWWWBBBBBBBB'.
Powinienem był wygrać dawno temu, czy się mylę?Odpowiedzi:
Cudowny, 973b
To naiwne wdrożenie wskazanej strategii w pytaniu. Oczekuje, że tablica zostanie podana jako 16 parametrów linii poleceń / płyty głównej,
hex.mbl B W E E E W E E E B E E E E E E
i wyświetli zindeksowaną pozycję następnego ruchu bieli.Wydaje mi się, że mogę z tego zrobić około 200 znaków dzięki lepszemu rozgałęzieniu i wyeliminowaniu ponownego użycia kodu.
źródło
Python 3, 100b
Strategia polega na tym, aby najpierw wyszukać
B
na tablicy. Jeśli nie ma, zwraca to-1
, co w pythonie jest takie samo jaklast index
. Tak więc na pustej planszy będzie mój pierwszy indeksindex=-1
, od którego zacznę się ruszać.Jeśli pole po mojej lewej stronie (
index-1
) jest wolne, mój następny ruch tam idzie. Jeśli zostanie zrobione, idę w górę w lewo. Nigdy nie muszę się wspinać: jeśli to zrobię, stracę tempo i przegram grę.Na pełnej planszy (
E
nigdzie nie ma ) nie wykonuję ruchu.Na początku
print
wydaje się to trochę dziwne: muszę zbudować nową planszę (co robię poprzez krojenie), ale potem muszę wyciąć 16 znaków. Jest to relikt, ponieważ pracuję z ujemnymi indeksami ib[i+1:]
dlatego zwrócę planszę z dziurami i resztę, której oczekuję, dlatego ważne jest, aby odciąć resztę. Innym sposobem byłaby praca z dodatnimi indeksami, np. Przyjmowanie(b.find('B')+16)%16
, ale(+16)%16
jest to o jeden bajt więcej niż()[:16]
.Nie golfowany:
Test
Podczas uruchamiania zestawu testów kontrolera szesnastkowego napotkałem dziwne zachowanie:
Myślę, że albo powinienem wygrać po czwartej turze, albo odpowiedź z tą samą tablicą na pełną tablicę powinna być poprawną odpowiedzią. Nie jestem pewien, co się tam dzieje, nie zanurkowałem głębiej - chciałem tylko sprawdzić, czy dostałem wszystkie „specjalne” przypadki. Ale ponieważ nie muszę ukrywać sytuacji, w których ktoś zaczyna na około 4 przestrzeni, to i tak nie ma znaczenia.
85b
Jeśli jednak pozwolę sobie nie sprawdzać pełnej płyty (tzn. Pomijając to
'E' in b
, mogę dodatkowo uprościć kod, aby używał tylko 85 bajtów:Doprowadzi to jednak do następujących sytuacji:
To może, ale nie musi być policzone, a ponieważ uznałem, że to nie był prawidłowy ruch, postanowiłem wybrać dłuższą, ale bardziej poprawną odpowiedź.
źródło