Nagrody
Nr 1 ( nagrodzony )
Wrzucę 50 powtórzeń za pierwszą prawidłową odpowiedź
Nr 2 ( nagrodzony )
Wrzucę kolejne 100 powtórzeń za najkrótszą prawidłową odpowiedź.
Nr 3 ( otwarty na zgłoszenia) )
Wrzucę 200 powtórzeń dla pierwszego z istotnie krótszą prawidłową odpowiedzią. Znaczące, co najwyżej 45% obecnie najkrótszej odpowiedzi ( 564 bajtów x 0,45 = maks. 254 bajtów ).
Gra
Pamiętasz klasyczną grę „ Nine Men's Morris ” czy po prostu „ Mill ”? Istnieje odmiana o nazwie Three Men's Morris, która jest trochę jak zmienny kółko i krzyżyk.
Zasady
Oto pusta plansza gry:
a b c
1 [ ]–[ ]–[ ]
| \ | / |
2 [ ]–[ ]–[ ]
| / | \ |
3 [ ]–[ ]–[ ]
[ ]
jest polem i |–/\
reprezentuje trasy między tymi polami.
Gra rozgrywana jest przez dwóch graczy 1
i 2
którzy każdego Place 3 żetony na planszy. To się już zdarzyło i jesteśmy w grze. Gra zostaje wygrana, jeśli jeden gracz może utworzyćmill
pionowy lub poziomy rząd 3 żetonów gracza.
Tokeny można przenosić na planszy wzdłuż linii łączących, zgodnie z tą zasadą:
Do dowolnego sąsiedniego pustego położenia (tj. Od położenia krawędzi do środka lub od środka do położenia krawędzi lub od położenia krawędzi do sąsiedniej pozycji krawędzi
Gracz musi wykonać ruch, chyba że nie ma sąsiedniej pustej pozycji, w którym to przypadku ruch jest pomijany.
Wyzwanie
Jesteś graczem, 1
a twój ruch jest następny. Napisz program lub funkcję, która określa, czy:
- możesz wymusić wygraną 2 lub mniej ruchami ( ostateczna wygrana )
- możesz wygrać 2 lub mniej ruchami, jeśli twój przeciwnik popełni błąd ( możliwa wygrana )
- nie możesz wygrać z 2 lub mniej ruchami, ponieważ potrzebujesz więcej ruchów lub ponieważ ruchy wymuszone prowadzą przeciwnika do zwycięstwa ( niemożliwe do wygrania )
Wymagania
- Nawet jeśli zdecydowanie wygrasz, gdy nudzisz przeciwnika na śmierć, twój program musi zakończyć się w określonym czasie.
- Możesz napisać program lub funkcję.
Wejście
Gracze są reprezentowani przez 1
i 2
. 0
określa wolne pole. Możesz przyjmować dane wejściowe jako macierz lub tablicę.
Określony
A B C D
2 1 0 | 2 1 0 | 1 0 1 | 1 2 2
2 1 2 | 0 1 0 | 1 0 2 | 2 1 O
0 0 1 | 2 2 1 | 0 2 2 | O O 1
A: [2,1,0,2,1,2,0,0,1]
B: [2,1,0,0,1,0,2,2,1]
C: [1,0,1,1,0,2,0,2,2]
D: [1,2,2,2,1,0,0,0,1]
Możliwy
A B C
1 0 1 | 1 0 1 | 1 2 2
1 2 2 | 1 2 0 | 0 0 1
2 0 0 | 2 0 2 | 2 1 0
A: [1,0,1,1,2,2,2,0,0]
B: [1,0,1,1,2,0,2,0,2]
C: [1,2,2,0,0,1,2,1,0]
Niemożliwy
A B
1 0 0 | 1 2 0
1 2 2 | 2 1 0
2 0 1 | 1 2 0
A: [1,0,0,1,2,2,2,0,1]
B: [1,2,0,2,1,0,1,2,0]
Wynik
Twój program powinien wypisać / zwrócić buźkę:
- Zdecydowana wygrana:
:)
- Możliwa wygrana:
:|
- Nie można wygrać:
:(
Przykłady
Zdecydowana wygrana w dwóch ruchach:
[2][1][ ] 1. [2][1][ ]
[2][1][2] -> [2][1][2]
[ ][ ][1] [ ][1][ ]
[2][1][ ] 1. [2][1][ ] [ ][1][ ] 2. [ ][ ][1]
[ ][1][ ] -> [ ][ ][1] -> [2][ ][1] -> [2][ ][1]
[2][2][1] [2][2][1] [2][2][1] [2][2][1]
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][ ][2] -> [1][ ][2] -> [1][ ][2] -> [ ][ ][2]
[ ][2][2] [ ][2][2] [2][ ][2] [2][ ][2]
Możliwe zwycięstwo w dwóch ruchach:
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][2][ ] -> [1][2][ ] -> [1][2][2] -> [ ][2][2]
[2][ ][2] [2][ ][2] [2][ ][ ] [2][ ][ ]
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][2][ ] -> [1][2][ ] -> [1][2][2] -> [ ][2][2]
[2][ ][2] [2][ ][2] [2][ ][ ] [2][ ][ ]
[1][2][2] 1. [ ][2][2] [2][ ][2] 2. [1][2][2]
[ ][ ][1] -> [1][ ][1] -> [1][ ][1] -> [1][1][1]
[2][1][ ] [2][1][ ] [2][1][ ] [2][ ][ ]
Nie można wygrać w dwóch ruchach:
[1][ ][ ]
[1][2][2]
[2][ ][1]
Premia
W przypadku, gdy możliwa jest określona wygrana, a Twój program generuje ruchy jednej drogi do sukcesu, a także a1:a2
(1 ruch) lub a1:a2,a3:b2
(2 ruchy), możesz wycofać 30% liczby bajtów.
To jest golf golfowy - wygrywa więc najkrótsza odpowiedź w bajtach. Standardowe luki są niedozwolone.
Podziękowania dla Petera Taylora, który naprawił kilka błędów i poprawił brzmienie w piaskownicy .
źródło
[1,0,0,2,1,0,2,2,1]
, gracz 2 nie może się ruszyć - czy to wygrana dla gracza 1?Odpowiedzi:
Haskell,
580564441 bajtówTak daleko mogę teraz grać w golfa. Nie jestem pewien, czy inne języki to pokonają.
Wywołaj
m
listę takich jak[[2,1,0],[2,1,2],[0,0,1]]
(Definite A).Kod testowy:
mapM_ m al
zwroty:źródło
C # -
739663 bajtówKompletny program, odczytuje dane wejściowe z argv i wydaje się działać. Uruchom to jak
Jeśli ta metoda wprowadzania danych jest niedopuszczalna, chętnie ją zmienię (nigdy nie lubię używać argv).
Nie byłem skłonny publikować tego wczoraj, ponieważ nie byłem w stanie dużo zagrać w golfa (nie miałem tyle czasu i być może nie trenowałem), ale ponieważ nie otrzymałem jeszcze odpowiedzi, „ W każdym razie opublikuję to, z pewnością nie spodziewam się nagrody, wolałbym, żeby trafił do kogoś, kto włoży trochę więcej wysiłku przed wysłaniem!
Edytować: zastąpiłem wszystkie boole intami, co oznaczało, że mogłem lepiej wykorzystać Linq, i udało mi się zwinąć obie pętle foreach, dając duże oszczędności. Jestem nieco zaskoczony, że
h
licznik działa ... ++ jest tak subtelnym narzędziem.Program jest bardzo prosty, po prostu bada każdy możliwy zestaw ruchów (przechowuje stan planszy w ciągu []). Powtarza wszystkie nasze możliwe ruchy (tablice, które z nich wynikają) i zlicza liczbę odpowiedzi naszego przeciwnika, które możemy pokonać ( ). Jeśli uda nam się wygrać, to jest to możliwe i dodajemy 1 do sumy, jeśli możemy wygrać je wszystkie, jest to określony i dodajemy 2 do sumy. Niektóre maksimum jest zatem naszym najlepszym możliwym wynikiem, i indeksujemy ciąg „(|))”, aby zwrócić odpowiednią twarz. Zauważ, że potrzebujemy dodatkowego „)”, ponieważ suma może wynosić 2 lub 3, jeśli jest to określona (możliwe, że nie jesteśmy w stanie pokonać żadnych odpowiedzi, które już wygrały za pierwszym razem, więc możliwa kontrola to odrobinę wprowadzające w błąd).
G
), czyli te, które wygrywamy, a on nie. Liczy także liczbę możliwych odpowiedzi (h
Program sprawdza zwycięstwo, wytwarzając ciąg z planszy, czyli oddzielone spacjami rzędy i kolumny, i po prostu szuka ciągu 3 postaci gracza w tym ciągu (np. „201 201 021 220 002 111” to wygraj dla nas)
Oto mój skrypt testowy:
Które wyjścia
źródło
PowerShell
576550 bajtówNie będę tak łatwo odstraszać - jeśli nie mogę uzyskać C # poniżej 631 bajtów, będę musiał użyć innego języka! Mam nadzieję, że Leif Willerts straci 5 bajtów z jego odpowiedzi, ponieważ zdecydowałem, że nie przepadam za PowerShellem, może po prostu muszę spojrzeć na to obiektywnie pod względem liczby bajtów ...
To jest skrypt, uruchamiasz go
. .\mill.ps1 "201102021"
. To całkiem dobrze kopia mojej odpowiedzi w języku C #, tylko w języku, z którym nie mam doświadczenia. Nie poczyniłem zbyt wiele wysiłku, aby zagrać w golfa, ponieważ zajęło to tak dużo czasu, aby zacząć pracę, i jest już dość kompaktowy.Edycja: nie można po prostu zostawić tam tych
[Math]::Floor
połączeńJeśli opisujesz, jak to działa ... odpowiedź w języku C # jest dla Ciebie, ale mam nadzieję, że komentarze wyraźnie ją wyjaśnią. Średniki mogą nie pasować idealnie do polecenia jednowierszowego, nie jestem jeszcze pewien, gdzie są potrzebne i nie są, i nie skopiowałem ich z powrotem, gdy umieściłem całość w jednym wierszu.
Skrypt testowy (PowerShell):
Wyjście:
źródło
Python 3,
566557 bajtówBędę musiał sprawdzić, czy mogę dalej grać w golfa, czy też mogę uzyskać 30% premii, ale po dłuższym zwlekaniu oto moja odpowiedź.
Nie golfowany:
źródło