Wyniki (22 maja 2017 21:40:37 UTC)
Master
wygrał 18 rund, przegrał 2 rundy i remis 0 rund
Save One
wygrał 15 rund, przegrał 3 rundy i remis 2 rund
Machine Gun
wygrał 14 rund, przegrał 3 rundy i remis 3 rundy
Monte Bot
wygrał 14 rund, przegrał 3 rundy i remis 3 rund
Amb Bot
wygrał 12 rundy, przegrał 8 rund i remis 0 rund
Coward
wygrał 11 rund, przegrał 3 rundy, remis 6 rund
Pain in the Nash
wygrał 11 rund, przegrał 9 rund, a remis 0 rund
Nece Bot
wygrał 10 rund, przegrał 7 rund, a remis 3 rund
Naming Things is Hard
wygrał 10 rund, przegrał 7 rund, a remis 3 rund
The Procrastinator
wygrał 10 rund, przegrał 8 rund, remis 2 rund
Yggdrasil
wygrał 10 rund, przegrał 10 rund, a remis 0 rund
Simple Bot
wygrał 9 rund, przegrał 4 rundy, a remis 7 rund
Table Bot
wygrał 9 rund, przegrał 6 rundy i remis 5 rund
Prioritized Random Bot
wygrał 8 rund, przegrał 7 rund i remis 5 rund
Upper Hand Bot
wygrał 7 rund, stracił 13 rund i remis 0 rund
Aggressor
wygrał 6 rund, przegrał 10 rund i remis 4 rund
Insane
wygrał 5 rund, przegrał 15 rund, a remis 0 rund
The Ugly Duckling
wygrał 4 rundy, przegrał 16 rund, a remis 0 rund
Know Bot
wygrał 3 rundy, przegrane 14 rund i remis 3 rund,
Paranoid Bot
wygrane 0 rund, przegrane 19 rund, a remis 1 rundy,
Panic Bot
wygrane 0 rund, przegrane 19 rund i remis 1 rundy
Niestety nie mogłem przetestować Szalonego losowego kodu X, ponieważ nie mogę go uruchomić z Linuksa. Uwzględnię go, jeśli uda mi się go uruchomić.
Pełna moc wyjściowa kontrolera
Gra
To bardzo prosta gra KoTH. To pojedynek na śnieżki jeden na jednego. Masz początkowo pusty pojemnik, który może pomieścić k
śnieżki. Możesz uchylać się do j
czasów. W każdej turze obaj gracze proszeni są jednocześnie o wybór sposobu wykonania ruchu. Istnieją trzy ruchy:
- reload: daje kolejną śnieżkę (do
k
) - rzut: rzuca śnieżką, która zabije drugiego gracza, jeśli zdecyduje się go przeładować. Jeśli obaj gracze rzucą śnieżką, nikt nie umiera (mają tak dobry cel, że trafią się śnieżkami)
- Kaczka: nic nie robi i unika trafienia, jeśli inny gracz rzuci śnieżną kulą. Jeśli nie masz już kaczek, nic się nie dzieje, a jeśli inny gracz rzuci śnieżną kulą, giniesz.
Cel
Nie umieraj
Specyfikacje wyzwania
Twój program może być napisany w dowolnym języku. Każdą z tych zmiennych należy traktować jako argument przy każdym wykonaniu:
[turn, snowballs, opponent_snowballs, ducks, opponent_ducks, max_snowballs]
turn
- ile tur minęło ( 0
przy pierwszej iteracji)
snowballs
- ile masz śnieżek
opponent_snowballs
- ile śnieżek ma przeciwnik
ducks
- ile razy możesz uchylić się
opponent_ducks
- ile razy przeciwnik może uchylić się
max_snowballs
- maksymalna liczba śnieżek store ( k
)
Wyjście kluczowej funkcji powinno być 0
do przeładowania, 1
do rzutu i 2
do kaczki. Musisz wyprowadzić swój ruch, nowa linia została zakończona. Nie wysyłaj nieprawidłowych ruchów, ale kontroler jest bardzo odporny i nie zepsuje się, jeśli wyślesz nieprawidłowe ruchy (nawet jeśli twój ruch nie jest nawet liczbą całkowitą). To musi być zakończony znakiem nowej linii chociaż. Jeśli nie ma ruchu [0, 1, 2]
, domyślnie zostanie on przeniesiony do 0
. Zwycięzca zostanie wyłoniony jako gracz, który uzyska najwięcej zwycięstw w pełnym turnieju round-robin.
Zasady
Możesz czytać / zapisywać z / do jednego pliku w celu przechowywania w pamięci między iteracjami. Twój bot zostanie umieszczony we własnym katalogu, aby konflikty nazw plików nie wystąpiły. Nie można zmieniać wbudowanych funkcji (takich jak generator losowy). To było dość zabawne za pierwszym razem , ale już nie będzie. Twój program nie może robić rzeczy, które są po prostu rażącym opóźnieniem wykonania. Obowiązują standardowe luki .
Testowanie
Kod źródłowy kontrolera można znaleźć tutaj . Przykład uruchomienia: java Controller "python program1/test1.py" "python program2/test2.py" 10 5
na 10 śnieżek i 5 kaczek.
Osądzać
Zwycięzca zostanie wyłoniony przez wybranie osoby, która uzyska najwięcej zwycięstw po pełnej rundzie. Chociaż jest to remis, usuń wszystkich ludzi, którzy nie mają najwięcej wygranych. Następnie powtarzaj, aż jedna osoba wygra. Standardem oceny będzie 50 śnieżek i 25 kaczek.
Happy KoTHing!
EDYCJA : Gra zostanie uznana za remis, jeśli przejdzie 1000 rund. Twój bot może to założyć turn < 1000
.
źródło
Odpowiedzi:
Master, C #
Trenowałem małą sieć neuronową (używając Sharpneat ). Wydaje się, że lubisz podnosić śnieżki i schować się ...
W poprzedniej wersji kontrolera nawet znalazł błąd. Z 0% wygrał do 100%, kiedy odkrył, jak wygrywać poprzez oszukiwanie.
Edycja: Zapomniałem zresetować stan interalu sieci i źle wyszkoliłem sieć. Nowo przeszkolona sieć jest znacznie mniejsza.
źródło
Save One, Python
Natychmiast rzuca większość śnieżek, ale zawsze ratuje jedną na wypadek, gdyby przeciwnik szukał amunicji. Następnie kacze tak długo, jak to możliwe (ponownie, oszczędzając 1) przed przeładowaniem, chyba że istnieje zagwarantowane bezpieczne przeładowanie lub zabójstwo.
źródło
PrioritizedRandomBot, Java
Bot wybiera losowo liczbę całkowitą w zakresie
0
doos + od
i wybiera albo rzutu, kaczka lub wymianie z progów oznaczyć przez jego aktualnej liczbie kami i kaczki.Jedną rzeczą, o której należy pamiętać, jest to, że gdy jeden bot ma więcej śnieżek niż drugi ma śnieżki + kaczki, możesz zmusić wygraną. Na tej podstawie możemy wymyślić pojęcie „punktów”:
Jeśli którakolwiek z tych liczb stanie się dodatnia, gracz ten może wymusić wygraną.
Tabela „Różnica punktów” stanowi podstawę teorii gier dla tego konkursu. Nie do końca przechwytuje wszystkie informacje, ale pokazuje, że śnieżki są zasadniczo cenniejsze niż kaczki (ponieważ śnieżki są zarówno atakiem, jak i obroną). Jeśli przeciwnik rzuci śnieżną kulą i uda ci się uchylić, jesteś o krok bliżej do wymuszonego zwycięstwa, ponieważ twój przeciwnik zużył cenniejsze zasoby. W tej tabeli opisano także, co należy zrobić w wielu specjalnych przypadkach, na przykład gdy niektóre opcje ruchu nie są dostępne.
Tabela „suma punktów” pokazuje, jak z biegiem czasu suma punktów zbliża się do zera (gdy obu graczom zabrakło kaczek), w którym momencie pierwszy gracz popełni błąd (przeładuje, gdy nie musiał) natychmiast przegrywa
Teraz spróbujmy rozszerzyć tę strategię wymuszania na przypadki, w których tak naprawdę nie jest to możliwe (na przykład, wygrywamy z dużym marginesem, ale czytanie myśli przez przeciwnika nas pokona). Zasadniczo mamy
s
śnieżki, ale musimy wygrywać śnieżkami przeciwnikas+1
(lubs+2
itd.), Aby wygrać. W takim przypadku chcemy wykonać kilka kaczek lub kilka przeładowań, aby kupić sobie trochę czasu.W tej chwili ten bot zawsze próbuje się zakraść w niektórych kaczkach, po prostu dlatego, że nie ryzykuje natychmiastowej straty: zakładamy, że przeciwnik stosuje podobną strategię lobbowania jak największej liczby śnieżek, więc próba przeładowania jest naprawdę niebezpieczny. Ponadto, aby zapobiec przewidywalności, chcemy się do nich przekraść, postępując zgodnie z rozkładem równomiernie losowym: prawdopodobieństwo zanurkowania zależy od tego, ile kaczek musimy wykonać w stosunku do liczby śnieżek, które musimy rzucić.
Jeśli przegrywamy bardzo źle, w takim przypadku
s + d < os + od
musimy podkraść się w niektórych przeładowaniach oprócz korzystania z wszystkich naszych kaczek, w tym przypadku chcemy przeładować losowo, ale tylko tyle razy, ile potrzebujemy.Właśnie dlatego nasze boty ustalają priorytety w kolejności rzucania, uchylania się i przeładowywania oraz używają
os + od
do generowania losowej liczby, ponieważ jest to progowa liczba ruchów, którą musimy wykonać.Istnieje jeden przypadek krawędzi i dwa inne przypadki szczególne, które bot obecnie obsługuje. Przypadek skrajny ma miejsce, gdy przeciwnik nie ma śnieżek ani kaczek, a więc losowanie nie działa, więc rzucamy, jeśli to możliwe, w przeciwnym razie przeładowujemy. Innym szczególnym przypadkiem jest sytuacja, w której przeciwnik nie może przeładować, więc rzucanie nie ma żadnej korzyści (ponieważ przeciwnik będzie rzucał lub rzucał), więc zawsze uciekamy (ponieważ ratowanie naszych śnieżek jest cenniejsze niż ratowanie naszych kaczek). Ostatni szczególny przypadek dotyczy sytuacji, gdy przeciwnik nie ma śnieżek, w którym to przypadku gramy bezpiecznie i przeładowujemy, jeśli to możliwe.
źródło
NeceBot - Python
Oto tabela teorii gry:
Gdzie
~
oznacza, że żadna przewaga, nieW
jest wygrana,L
jest przegrana,+-S
oznacza , że śnieżka jest zdobywana / przegrywana nad przeciwnikiem, a+-D
oznacza, że kaczka jest zdobywana / tracona nad przeciwnikiem. To jest całkowicie symetryczna gra.Pamiętaj, że moje rozwiązanie nie uwzględnia tej tabeli. Ponieważ jestem kiepski z matematyki.
Nazywa się NeceBot, ponieważ najpierw próbuje zmniejszyć to, co jest konieczne. Potem ma jakieś arbitralne strategie, które, mam nadzieję, zadziałają.
źródło
<3
s lol. +1 za posiadanie stołu do gry i nieużywanie go: P Ale fajne rozwiązanie :)3 + opponent_snowballs <3
to może być pomyłka?<3
s sprawia, że kod jest trudny do zrozumienia :(Tchórz - Scala
Rzuca, jeśli przeciwnik nie ma amunicji, w przeciwnym razie (w kolejności pierwszeństwa) kaczki, rzuty lub przeładowania.
źródło
TheUglyDuckling - Python
Zawsze uchyla się, dopóki nie będzie mógł rzucić, jeśli przeciwnik jest pusty lub przeładować, jeśli oba są puste. Użyje przeładowania w ostateczności.
źródło
SimpleBot - Python 2
Proste rzeczy.
źródło
Bot Naming-Things-is-hard - VB.NET
Nazywanie rzeczy jest trudne i nie jestem pewien, czy mam spójną strategię, by to nazwać.
Próbuje zagrać przez kilka pierwszych rund, aby uzyskać wczesne zwycięstwo. Następnie gra bezpieczniej przez resztę czasu, próbując wygrać przez ścieranie.
źródło
MachineGun, Python 3
Próbuje oszczędzać śnieżki, dopóki nie zabije przeciwnika lub nie wydostanie się z kaczek (w takim przypadku zaczyna ślepo strzelać wszystkimi śnieżkami, jak karabin maszynowy)
Kacze także, gdy przeciwnik ma śnieżkę, ponieważ nie chce umrzeć.
źródło
Knowbot, Python3
Śledzi częstotliwość poprzednich ruchów, zakłada, że przeciwnik ponownie wykona najczęstszy, broni się przed tym.
** Zaktualizowano, aby nie oczekiwać ruchów, których przeciwnik nie może wykonać **
źródło
Braingolf , Agresor
Agresor nie jest tchórzem! Jeśli ma śnieżkę, rzuci! Jeśli nie ma śnieżek, uczyni więcej!
Braingolf , Szalony
To nie jest bot, to tylko programista, którego porwałem i zmuszałem do przeniesienia każdego projektu, który kiedykolwiek zrealizował, do braingolfa. Nie ma już odrobiny rozsądku.
Generuje liczbę losową mniejszą niż 3 i wysyła,
t % r
gdzie t jest bieżącą turą, a r jest liczbą losowąAby je uruchomić, musisz pobrać
braingolf.py
z github, a następnie zapisać kod braingolfa w pliku i uruchomićlub po prostu wstaw kod bezpośrednio w ten sposób
Dane wejściowe są dość nieistotne, dopóki drugi argument po kodzie / nazwie pliku jest liczbą śnieżek, które posiada Aggressor.
Uwaga: agresor zachowuje się identycznie jak TestBot, chciałem tylko zrobić wpis w braingolfie
Braingolf , The Brainy [Broken now teraz]
źródło
TestBot - Python
To jest przesłanie testowe, które pokazuje, jak może wyglądać prawidłowe zgłoszenie. Strategia: naprzemienne przeładowywanie i rzucanie. Zła strategia, ale daje wyobrażenie o tym, jak powinien działać Twój program.
źródło
_, turn, snowballs, opponent_snowballs, ducks, opponent_ducks, max_snowballs = sys.argv
byłyby argumenty?sys.argv[1:]
jeśli nie chcesz z tym_
UpperHandBot, Python 3
Ten bot próbuje zebrać więcej śnieżek niż jego przeciwnik, i w tym momencie zaczyna rzucać. Jeśli w dowolnym momencie UHB nie ma więcej śnieżek niż jego przeciwnik, będzie:
źródło
Yggdrasli, Java
Nazwałem tego bota „Yggdrasil”, ponieważ tak naprawdę spogląda on w dół drzewa gry i dokonuje oceny stanu, na podstawie której może obliczyć w przybliżeniu idealną strategię mieszaną. Ponieważ opiera się na strategiach mieszanych, jest bardzo niedeterministyczna. Nie wiem, jak dobrze to się sprawdzi w prawdziwej konkurencji.
Kilka rzeczy na temat tego bota:
źródło
Pain in the Nash (C ++)
Tak zwane, ponieważ fakt, że musiałem napisać własny solver równowagi Nasha, był prawdziwym bólem. Dziwi mnie, że nie ma łatwo dostępnych bibliotek do rozwiązywania problemów z Nash!
Skompiluj jako C ++ 11 lub nowszy. Dla wydajności dobrze jest skompilować ze wsparciem OpenMP (ale jest to tylko dla szybkości; nie jest wymagane)
To wykorzystuje równowagę Nasha do decydowania, co robić w każdej turze, co oznacza, że teoretycznie zawsze wygra lub zremisuje na dłuższą metę (w wielu grach), bez względu na to, jaką strategię stosuje przeciwnik. To, czy tak jest w praktyce, zależy od tego, czy popełniłem jakieś błędy przy wdrażaniu. Ponieważ jednak konkurencja KoTH ma tylko jedną rundę przeciwko każdemu przeciwnikowi, prawdopodobnie nie będzie dobrze na tablicy wyników.
Moim pierwotnym pomysłem było posiadanie prostej funkcji wyceny dla każdego stanu gry (np. Każda piłka jest warta + b, każda kaczka jest + d), ale prowadzi to do oczywistych problemów z określeniem, jakie powinny być te wyceny, i oznacza, że nie może działać na malejące zyski ze zbierania coraz większej liczby piłek itp. Zamiast tego przeanalizuje to całe drzewo gry , pracując wstecz od tury 1000, i wypełni rzeczywiste wyceny na podstawie tego, w jaki sposób każda gra może się układać.
Rezultat jest taki, że nie mam absolutnie pojęcia, jakiej strategii to używa, poza kilkoma zakodowanymi „oczywistymi” zachowaniami (rzucaj śnieżkami, jeśli masz więcej piłek niż przeciwnik ma piłek + kaczek, i przeładuj, jeśli obaj jesteś poza śnieżek). Jeśli ktoś chce przeanalizować generowany przez siebie zestaw danych, wyobrażam sobie, że istnieje kilka ciekawych zachowań do odkrycia!
Testowanie tego pod kątem „Save One” pokazuje, że rzeczywiście wygrywa w długim okresie, ale tylko niewielką marżą (514 wygranych, 486 strat, 0 losowań w pierwszej partii 1000 gier i 509 wygranych, 491 strat, 0 zwraca drugą).
Ważny!
Będzie to działać od razu po wyjęciu z pudełka, ale to nie jest świetny pomysł. Wygenerowanie pełnego drzewa gry zajmuje około 9 minut na moim laptopie o średniej specyfikacji programistów. Ale zapisze ostateczne prawdopodobieństwa w pliku po ich wygenerowaniu, a następnie każda tura generuje losową liczbę i porównuje ją z 2 bajtami, więc jest superszybka.
Aby to wszystko skrócić, wystarczy pobrać ten plik (3,5 MB) i umieścić go w katalogu z plikiem wykonywalnym.
Możesz też wygenerować go samodzielnie, uruchamiając:
Co pozwoli zapisać jeden plik na turę, aż do konwergencji. Zauważ, że każdy plik ma 3,5 MB i zbiegnie się w czasie 720 (tj. 280 plików, ~ 1 GB), a ponieważ większość gier nie zbliża się do końca 720, pliki przed konwergencją mają bardzo małe znaczenie.
źródło
Swift - TheCrazy_XcodeRandomness
Niestety, może to być zabrakło tylko lokalnie, w Xcode, ponieważ zawiera
Foundation
moduł i jego funkcjiarc4random_uniform()
. Jednak możesz właściwie powiedzieć, jaki jest algorytm:źródło
swift
polecenie, a następnie sprawdź, czy działaFoundation
, przepraszam: /TableBot, Python 2
Nazywany TableBot, ponieważ został utworzony przez implementację tej tabeli:
1 oznacza posiadanie 1 lub więcej, 0 oznacza brak.
Bot:
Wypróbuj online!
źródło
AmbBot - program rakietowy
Głównie chciałem wypróbować używanie
amb
, ponieważ jest fajne. Ten bot losowo porządkuje opcje (przeładuj, rzucaj i uciekaj), odfiltrowuje te, które nie mają sensu, i wybiera pierwszą opcję. Ale dziękiamb
, możemy korzystać z kontynuacji i cofania się!Zrobiłem również mały program testowy, aby uruchomić dwa z tych botów przeciwko sobie. Wydaje się, że drugi bot wygrywa częściej, więc mogłem gdzieś pomylić.
źródło
MonteBot, C ++
Zasadniczo wziąłem kod z tego Kotha i zmodyfikowałem go do tego wyzwania. Wykorzystuje algorytm Decoupled Tree Search Monte Carlo. Powinno być całkiem blisko równowagi Nasha.
Instrukcje kompilacji dla systemu Linux:
Zapisz w
MonteBot.cpp
.Uruchom
g++ -o -std=c++11 MonteBot MonteBot.cpp
.Polecenie do uruchomienia:
./MonteBot <args>
źródło
Procrastinator - Python 3
Prokrastynator zwleka, grając z wyjątkiem pierwszych kilku tur. Nagle paniczny potwór chce uniknąć przegranej wojny o zasoby, przeciwstawiając się najczęściej używanemu ruchowi przeciwników.
źródło
ParanoidBot i PanicBot - ActionScript3 ( RedTamarin )
Z niedopasowanego, niszowego języka (z rozszerzeniami do dostarczania argumentów wiersza poleceń) pochodzi płochliwy ParanoidBot i jego tępy sojusznik, PanicBot.
ParanoidBot
ParanoidBot traci rozum i ma niepotrzebnie określoną strategię, na której może polegać. Po pierwsze, wystrzeliwuje śnieżki aż do osiągnięcia progu, zachowując trochę rezerwy. Następnie, po trzech ostrzegawczych kaczkach, pojawia się paranoja, a bot próbuje zgromadzić więcej śnieżek między losowymi kaczkami. Po uzupełnieniu zapasów ParanoidBot wraca do ślepego rzucania. Ze względu na głosy w głowie ParanoidBot może stwierdzić, czy na pewno wygra, czy przegra, i odpowiednio „strateguje”.
Szelki są trochę nieporęczne, aby pomóc skondensować rozmiar
PanicBot
Po tym, jak oszalał, PanicBot reaguje na instynktowny strach. Po wyczerpaniu się kaczek od kulącego się ze strachu PanicBot ślepo rzuca wszystkie swoje śnieżki, a następnie desperacko robi i rzuca więcej śnieżek, aż (prawdopodobnie) zostanie pokonany.
Jest to jeden z mniej niż 15 innych wpisów używających AS3 tutaj na PPCG. Pewnego dnia być może ten prawdopodobnie egzotyczny język znajdzie zagadkę do zdominowania.
źródło
snow.as
, następujące czynności powinny działać w trybie bash:$ ./redshell snow.as -- 0 50 50 25 25
chmod +x redshell
jest tutaj twoim przyjacielem ...Defender, Python
Przeładowuje, gdy żaden z graczy nie ma śnieżek. Jeśli ma śnieżki, rzuca. Jeśli nie ma śnieżek, ale przeciwnik tak, to skacze, jeśli może, inaczej przeładuje.
Uwaga: jeszcze nie przetestowane
źródło