W przyszłości, gdy podróżowanie w czasie (w skrócie TT) będzie powszechne, rzucanie monetami stanie się poważnym sportem umysłowym. Aby przygotować się na przyszłość, tworzymy konkurs na programy, w których podróże w czasie będą się naprawdę działo z punktu widzenia zgłoszeń.
Konkurs jest królem wzgórza w stylu robota okrągłego, polegającym na rzucaniu monetami między klasami Java.
Zasady losowania monet
- Jest dwóch graczy i 100 rund.
- W każdej rundzie rzuca się monetą i na podstawie wyniku jeden z graczy zdobywa 1 punkt. Każdy gracz ma 50% szans na zdobycie punktu.
- Po podrzuceniu obaj gracze mają szansę kontrolować czas, pociągając za dźwignie.
- Jeśli pociągniesz niebieską dźwignię (cofnij korek) TT nie będzie możliwe w rundzie, w której użyto dźwigni ani w żadnej wcześniejszej rundzie. Próby przejścia do tych rund TT nie przyniosą efektu.
- Jeśli pociągniesz czerwoną dźwignię (rewerter) , spróbujesz cofnąć czas do poprzedniej rundy. Jeśli się powiedzie , pamięć przeciwnika zostanie przywrócona do pamięci przed wybraną rundą, a wyniki losowania rozpoczynające się od wybranej rundy również zostaną usunięte . Jedynym możliwym znakiem dla przeciwnika na temat TT będzie liczba niewykorzystanych dźwigni, które nie zostaną cofnięte.
- Każdy gracz ma 5 niebieskich i 20 czerwonych nieużywanych dźwigni na początku meczu. TT nie wpływają na te dźwignie.
- Jeśli na końcu setnej rundy nie wydarzy się TT, gra się kończy, a gracz z wyższym wynikiem wygrywa.
Detale
- Rundy mają indeksowanie 1 (od 1 do 100).
- Przed rundą
x
otrzymujesz liczbę dostępnych niebieskich i czerwonych dźwigni, rzut monetą aż do turyx
(włącznie) i pamięć twojej (ostatniej)x-1
rundy. - Pociągnięcie niebieskiej dźwigni w rundzie
x
zatrzymuje wszystkie TT, które mają cel w rundziex
lub wcześniej (blokuje TT, jeśli zdarzy się również w tej samej dokładnej rundzie). - Powrót do rundy
x
oznacza, że następna runda będzie rundąx
. - Jeśli obaj gracze zdecydują się powrócić na koniec rundy, czas zostanie przywrócony do wcześniejszego celu, który nie jest blokowany. Gracz (y), którzy próbowali powrócić do tego czasu, zachowają swoją pamięć.
Szczegóły techniczne
- Powinieneś napisać klasę Java implementującą dostarczony interfejs Bot.
- Dodaj swojego bota do projektu.
- Dodaj instancję swojego Bota do
Bot
plikuController.java
. - Twoja klasa nie powinna przechowywać informacji między rozmowami . (W większości przypadków posiadanie tylko
final
zmiennych poza funkcjami spełnia to wymaganie). - Możesz przekazać kontrolerowi informacje w
memory
polu zwracanegoAction
obiektu. Zostanie ci to zwrócone w następnej turze, jeśli TT się nie wydarzyło. Jeśli zdarzy się TT, otrzymasz odpowiednią wcześniejszą pamięć. - Możesz użyć
totalScore()
metodyGame
klasy, aby uzyskać wynik ciągu historii.
Protokół
Na każdym kroku twoja
takeTurn(...)
metoda jest wywoływana z 5 argumentami:- liczba nieużywanych niebieskich dźwigni
- liczba nieużywanych czerwonych dźwigni
- historia losowania monet, ciąg składający się z 1 i 0 oznaczających twoje wygrane i przegrane w poprzednich rundach. Pierwszy znak odpowiada losowaniu pierwszej monety. (W pierwszej rundzie długość łańcucha będzie wynosić
1
.) - ciąg, twoja pamięć przechowywana z poprzedniej rundy
- indeks oparty na 1 tej rundzie
Za każdym razem twoja metoda zwraca
Action
obiekt zawierającyliczba całkowita w
move
polu opisującym twoje działanie:0
za brak działania-1
pociągnąć niebieską dźwignię i zablokować TT przechodzące przez tę rundę- dodatnia liczba całkowita
x
, nie większa niż bieżąca runda, aby pociągnąć czerwoną dźwignię i spróbować wrócić do rundyx
- Nieprawidłowe liczby całkowite są traktowane jako
0
.
ciąg zawierający twoją pamięć z tej rundy, którą chcesz zachować. Pamiętaj, że przechowywanie pamięci nie jest kluczową częścią wyzwania . Możesz dokonywać dobrych wpisów bez zapisywania użytecznych danych w ciągu. W pierwszej rundzie łańcuch będzie pusty.
Twoja metoda nie powinna zająć średnio więcej niż 10 ms na rundę w meczu.
- Regularne niedotrzymywanie terminu skutkuje dyskwalifikacją.
Punktacja
- Zwycięstwo w meczu daje 2 punkty, a remis - 1 punkt dla obu graczy. Strata nie daje punktów.
- Wynik bota będzie łączną liczbą punktów, które zebrał.
- Liczba meczów rozegranych między każdą parą zawodników będzie zależeć od liczby zgłoszeń i ich prędkości.
Dwa proste boty przykładowe są publikowane jako odpowiedzi.
Kontroler i kilka pierwszych botów są dostępne tutaj .
Wyniki testu z botami przesłanymi do 3 listopada .:
Wyniki ogółem:
Oldschool: 3163
Random: 5871
RegretBot: 5269
Nostalgia: 8601
Little Ten: 8772
Analyzer: 17746
NoRegretsBot: 5833
Oracle: 15539
Deja Vu: 5491
Bad Loser: 13715
(Kontroler jest oparty na Cat Catcher Challenge . Dziękujemy za @flawr, który jest dla niego bazą.)
Bonus: ładny 6-minutowy film oparty na podobnej koncepcji.
źródło
If you pull a blue lever (revert stopper) no TT is possible through that round anymore. TT's attempting to go through the round will have no effect.
Co „przechodzi przez rundę”?If you pull a blue lever (revert stopper) no TT is possible to the round the lever was used or any earlier round anymore. TT's attempting to go to these rounds will have no effect.
Odpowiedzi:
Analizator
Analizuje przeszłość, aby uzyskać najlepsze prognozy na przyszłość.
EDYTOWAĆ: Unika niebieskich czasów wylewania. Skutecznie wykorzystuje niebieskie dźwignie. Bardziej efektywnie wykorzystuje czerwone dźwignie. Dodano rzadkość na sezon Halloween.
EDYCJA: Wyłączone przez 1 błąd.
EDYCJA: Ulepszona
computeWinningProbability
funkcja. Teraz bardziej agresywnie używa czerwonych dźwigni i niebieskiej dźwigni.Ocena (od 2 listopada):
źródło
Nostalgia
Nie testowano, wystarczy szybkie dźgnięcie w próbę stworzenia bota, który trudno jest zablokować (ponieważ decyduje, kiedy pociągnąć czerwoną dźwignię głównie losowo), ale to podejmuje dobre decyzje.
Edycja: brakowało mi tej reguły:
Wydaje się, że to dobry powód, aby użyć pamięci - jeśli pamiętasz próbę przejścia do danej rundy, być może nie udało ci się, więc nie powinieneś próbować ponownie przejść do tej rundy. Edytowałem mojego bota, aby tego uniknąć.
źródło
Wyrocznia
Bezwstydnie skopiowałem jakiś kod z Analyzera (do parsowania pamięci). To poddanie próbuje wcześnie pociągnąć niebieską dźwignię, a następnie powoli buduje swoją przewagę. Myślę, że wydajność tego bota rekompensuje brzydki kod :)
źródło
RegretBot
Pod koniec
naszego życiażałujemy naszych porażek z przeszłości i staramy się je cofnąć i naprawić.źródło
Little Ten
Mała Dziesiątka często mnoży i dzieli przez 10, używając liczb, które są wielokrotnościami 10, i wraca do rund, które są wielokrotnościami 10.
Edycja: Zmieniłem nieco mechanikę teraz, gdy wyjaśnienie tego, co dzieje się po pociągnięciu niebieskiej dźwigni, jest jaśniejsze. Trochę też przywróciłem równowagę.
źródło
Losowy
Strategia Randoma jest następująca:
źródło
NoRegretsBot
źródło
Zły przegrany
Ten bot nie używa pamięci i jest zaskakująco dobry (ale nie pokonuje Analyzera ani Oracle).
źródło
Stara szkoła
Ten bot nigdy nie wykonuje żadnej akcji, ponieważ Oldschool nie wierzy w podróże w czasie.
źródło
Deja Vu Bot
Ten bot próbuje śledzić, kiedy ściąga niebieski, aby uniknąć czerwonych pociągnięć w tym regionie. Przyciąga czerwone dźwignie tylko wtedy, gdy jest znacznie w tyle w wyniku.
źródło