King of the Hill: Napad na bank

15

Przykładowy przebieg dodano 4/11

Wyjaśnienie zasad 4/8: Wszystkie zgłoszenia będą konkurować w jednym gigantycznym turnieju typu „wszystko dla wszystkich”, składającym się z tylu meczów, ile mój komputer może wykonać w ciągu 48 godzin.

Każdy, kto spędził czas na oglądaniu transmisji na Twitchu, jest świadomy przewagi DeepBota i być może nawet zna grę bukmacherską Bank Heist . Ten turniej King of the Hill jest bezpośrednio inspirowany tą grą. Ale nie martw się. Wydaje mi się, że włożyłem w tę wersję wystarczająco dużo supełków, aby było ciekawie.

Szybki przykład

#####GAME 13: 16 players######

Round 1:
gunHeCK bet 0.
PassivePanga bet 69.
SnitcherKing bet 1.
Lurker bet 0.
OC'sRandomTpyos bet 1.
MonisAddiction bet 69.
RaysFive01K bet 28.
LimeadeSneaktar bet 1.
KaylorrCriterion bet 0.
HardHatUmar bet 0.
HeCKuSumer bet 185.

Round 2
HeCKuSumer decided to !guncheck.
LimeadeSneaktar decided to double cross.
MonisAddiction decided to all in.
OC'sRandomTpyos decided to acquire intel.
RaysFive01K decided to deposit.
SnitcherKing decided to finger.
PassivePanga decided to !guncheck.

Results
PassivePanga failed. :(
SnitcherKing failed. :(
OC'sRandomTpyos was successful, and may gain ¥0
MonisAddiction failed. :(
RaysFive01K was successful, and may gain ¥0
LimeadeSneaktar was successful, and may gain ¥1
HeCKuSumer failed. :(

Results:
0. KaylorrCriterion: 3600
1. Lurker: 3600
2. gunHeCK: 3600
3. SnitcherKing: 3586
4. PassivePanga: 2634
5. LimeadeSneaktar: 2496
6. HeCKuSumer: 1909
7. HardHatUmar: 490
8. RaysFive01K: 255
9. OC'sRandomTpyos: 170
10. MonisAddiction: 0

(In this round, 7 players joined the heist, but the dice only rolled right for 3 of them. Of those, only LimeadeSneaktar brought any home--having stolen it from OcsRandomTpyos. RaysFive01K won significantly more, but deposited it all at the bank before leaving. At this point, the players who did not heist are doing well, living off their day jobs.)

#####GAME 14: 231 players######

Round 1:
Lurker bet 0.
HeCKuSumer bet 190.
KaylorrCriterion bet 0.
HardHatUmar bet 0.
MonisAddiction bet 0.
OC'sRandomTpyos bet 1.
gunHeCK bet 0.
LimeadeSneaktar bet 1.
RaysFive01K bet 25.
PassivePanga bet 69.
SnitcherKing bet 1.

Round 2
PassivePanga decided to !guncheck.
OC'sRandomTpyos decided to buy guard.
HeCKuSumer decided to !guncheck.
SnitcherKing decided to finger.
RaysFive01K decided to deposit.
LimeadeSneaktar decided to double cross.

Results
HeCKuSumer failed. :(
OC'sRandomTpyos failed. :(
LimeadeSneaktar failed. :(
RaysFive01K failed. :(
PassivePanga failed. :(
SnitcherKing failed. :(

Results:
0. KaylorrCriterion: 3840
1. Lurker: 3840
2. gunHeCK: 3840
3. SnitcherKing: 3825
4. PassivePanga: 2805
5. LimeadeSneaktar: 2495
6. HeCKuSumer: 1959
7. HardHatUmar: 490
8. MonisAddiction: 240
9. RaysFive01K: 229
10. OC'sRandomTpyos: 161

Six players heisted--but should have been paying more attention to the rabble and backed out, because the probabilities dropped too low to win, and all failed.


#####GAME 15: 300 players######

Round 1:
OC'sRandomTpyos bet 1.
Lurker bet 0.
SnitcherKing bet 1.
MonisAddiction bet 69.
LimeadeSneaktar bet 1.
gunHeCK bet 0.
HardHatUmar bet 0.
RaysFive01K bet 22.
KaylorrCriterion bet 0.
HeCKuSumer bet 195.
PassivePanga bet 69.

Round 2
HeCKuSumer decided to !guncheck.
OC'sRandomTpyos decided to buy guard.
MonisAddiction decided to all in.
PassivePanga decided to !guncheck.
LimeadeSneaktar decided to double cross.
RaysFive01K decided to deposit.
SnitcherKing decided to finger.

Results
OC'sRandomTpyos failed. :(
SnitcherKing failed. :(
MonisAddiction was successful, and may gain ¥0
LimeadeSneaktar failed. :(
RaysFive01K failed. :(
HeCKuSumer failed. :(
PassivePanga failed. :(

And here, the probabilities dropped too low to win again--except for MonisAddiction, who went all in, and therefore avoided the probability modification incurred by the rabble backing out. No winnings are listed here, because a player who wins going all in immediately adds all winnings to its holdings without any possible modification by other players' actions.

Zasady gry

Struktura turnieju / gry

  • Turniej będzie się składał z wielu gier losowanych losowo od 1000 do 1100, w których każde poważne zgłoszenie będzie konkurować jednocześnie w trybie darmowym dla wszystkich.
  • Każdy gracz rozpoczyna pierwszą grę z 240 kredytami, a każda kolejna gra z liczbą kredytów na koniec poprzedniej gry.
  • Każda gra przebiega w 2 rundach, aw każdej rundzie gracze są wzywani w kolejności ustalonej losowo równomiernie, aby podjąć jedną decyzję:
    • W pierwszej rundzie gracz może zapłacić dowolną liczbę całkowitą kredytów od 0 do swoich bieżących zasobów kredytowych, aby wziąć udział w napadzie na bank.
    • W drugiej rundzie każdy gracz, który zdecyduje się wziąć udział w napadzie, obstawiając co najmniej jeden kredyt (zwany dalej „napadami”), może zdecydować o wypuszczeniu zakładu (i może w tym czasie wykonać inną akcję), zrezygnuj z napadu lub wejdź za wszystko. (Te opcje są dalej opisane poniżej.)
  • W oparciu o liczbę napadów i całkowitą liczbę kredytów, które wypłacili, wybiera się jeden z pięciu banków, na których można dokonać napadu. Wybór ten wpływa na indywidualne prawdopodobieństwo zwycięstwa i szanse, według których ustala się wypłatę. (Banki opisano poniżej.)
  • Każdy heister, który nie zrezygnował, z prawdopodobieństwem (zmodyfikowanym) banku wygra swoją stawkę pomnożoną przez (zmodyfikowane) kursy bukmacherskie (zaokrąglone w dół), albo straci swoją stawkę. Pamiętaj, że sukces lub porażka każdego gracza jest ustalana indywidualnie - niektórym uda się tam, gdzie inni zawodzą.
  • Wszyscy gracze, niezależnie od tego, czy uczestniczyli, czy nie, odnieśli sukces lub nie, a następnie otrzymują wypłatę (z wyjątkami opisanymi poniżej).
  • Pamiętaj, że niemożliwe jest trwałe opuszczenie gry. W najgorszym przypadku gracz może poczekać na grę, aby otrzymać kolejną wypłatę.
  • Po wszystkich 1000-1100 grach gracz z największą liczbą punktów zostanie ogłoszony zwycięzcą tego turnieju.
  • Turniej zostanie powtórzony nieokreśloną liczbę razy (tyle, ile można obliczyć w ciągu 48 godzin), a zarobki gracza we wszystkich turniejach zsumowane w celu ustalenia ogólnego zwycięzcy tego konkursu.

Druga runda licytacji

  • Każdy gracz, który postawił dodatnią stawkę w pierwszej rundzie, może wziąć udział w drugiej rundzie.
  • W tej rundzie gracz może:
    • odpowiedz ciągiem „wycofaj się”, aby anulować zakład. Spowoduje to ustawienie zakładu na zero dla bieżącego napadu, a także nieznacznie zmniejszy prawdopodobieństwo, że gracze pozostający w napadzie odniosą sukces. Korzystając z tej opcji, gracz rezygnuje z wypłaty 240 kredytów, która następuje po napadzie jako kara za narażenie pozostałych spadkobierców na ryzyko. (Pozostałym spadkobiercom odniesiemy sukces z prawdopodobieństwem równym prawdopodobieństwu banku pomnożonemu przez ułamek spadkobierców, którzy się nie wycofali).
    • odpowiedz ciągiem „wszystko w”, aby wysadzić całe swoje zasoby kredytowe - i weź kredyt na wypłatę przy następnej wypłacie 240 kredytów - aby kupić najlepszy sprzęt i dane wywiadowcze i iść samemu, płonące pistolety, bez poleganie na kimkolwiek. Na prawdopodobieństwo zwycięstwa takiego gracza nie mogą wpływać inne spadki, które wypadają z napadu, ani wygranych nie mogą zostać skradzione przez podwójne krzyżyki. Zwycięskie wypłaty zostaną ustalone tak, jakby zakład był sumą posiadanych kredytów plus 240, podczas gdy strata ustawi swoje zasoby na zero.
    • Odpowiedz dowolnym innym łańcuchem (w tym pustym), aby trzymać się poprzedniego zakładu i przejść normalnie napadem. (Zalecana odpowiedź: „! Guncheck”). Niektóre odpowiedzi będą miały dodatkowe skutki uboczne:
      • Odpowiedź „zmiany zadań” spowoduje, że gracz rzuci pracę. Począwszy od tej rundy, na końcu każdej rundy gracz będzie miał 5% szans na zatrudnienie na nowej pozycji. Jeśli to się powiedzie, gracz zostaje zatrudniony i natychmiast otrzymuje pierwszą wypłatę. Każda nowa praca gwarantuje dokładnie 5% więcej niż poprzednia (zaokrąglona w dół). Ta akcja zakończy się sukcesem, niezależnie od tego, czy skok się powiedzie.
      • Odpowiedź „zdobądź dane wywiadowcze” spowoduje, że jeśli napad się powiedzie, gracz wyda wszystkie swoje wygrane z tego napadu, aby uzyskać dodatkowe 0,00001 na kredyt wydany w ten sposób na szanse banku, który został napadnięty tylko dla tego gracza . Ta modyfikacja kursów jest trwała. Na przykład, jeśli gracz wybierze tę akcję podczas napadu na bank 1 i wygra 6969 kredytów w napadzie, szanse banku 1 na tego gracza zostaną trwale zwiększone o 0,06969 i gracz nie otrzyma nic z tego napadu.
      • Odpowiedź „kupuj strażnika” spowoduje, że gracz wykupi jednego ze strażników w napadanym banku. W zamian za trwałe obniżenie o 1 kredyt wypłaty tego gracza (regularna łapówka strażnika), gracz otrzyma „stałe” zwiększone prawdopodobieństwo zwycięstwa w tym banku (ze względu na to, że strażnik „zapomina wspomnieć” temu graczowi, kiedy spytał). Prawdopodobieństwo wzrośnie o dokładnie 1% różnicy między bieżącym prawdopodobieństwem zwycięstwa gracza w tym banku a 100%. Ta akcja się powiedzie, nawet jeśli napad się nie powiedzie. UWAGA: Jeśli w dowolnym momencie gracz nie ma wystarczającej liczby kredytów, aby zapłacić wszystkie swoje łapówki strażnicze, natychmiast i „trwale” traci tyle premii prawdopodobieństwa, ile liczby łapówek, których nie można było wypłacić,
      • Odpowiedź „depozytu” spowoduje, że skok zakończy się sukcesem, a całe wygrane gracza zostaną zapisane na koncie w banku poddanym napadzie. Kredyty nie będą dostępne w żadnym celu ani nie będą liczone do wyniku gracza, dopóki nie zostaną wycofane. To konto będzie płacić odsetki w wysokości 0,14% na grę.
      • Jeśli „napad” się powiedzie, odpowiedź „wypłać” doda do wygranych gracza całą zawartość jego konta w banku, który dokonał napadu. W rezultacie konto zostanie wyzerowane. Pamiętaj, że te dodatkowe wygrane mogą zostać skradzione przez podwójnych krzyżowców.
      • Odpowiedź „podwójnego krzyża” zrobi jedną z dwóch rzeczy:
        • Jeśli liczba spadkobierców, którzy zagrali w „podwójny krzyż”, wynosi najwyżej 1/10 (w zaokrągleniu w dół) całkowitej liczby spadkobierców niebędących motłochem, którzy zdecydowali się wykonać skok (lub dokładnie jeden, jeśli jest mniej niż 10 takich graczy) ), gracz otrzyma dodatkowe wygrane równe łącznej wygranej wszystkich graczy nieposiadających podwójnego krzyża podzielonej przez liczbę podwójnych krzyżyków (w zaokrągleniu w dół). Wszystkie osoby niebędące podwójnymi krzyżownikami w tym przypadku otrzymują 0 kredytów z napadu. Innymi słowy, podwójni krzyżowcy kradną kredyty wszystkich innych i dzielą je równo między siebie.
        • Jeśli liczba heisterów, którzy zagrali w „podwójny krzyż”, przekroczy próg, gracz nie otrzyma żadnej wygranej (jeśli jego skok się powiedzie), zostanie zmniejszona wypłata o połowę i zostaniesz zwolniony z pracy. (Patrz „zmiana zleceń”.) W tym przypadku wszyscy nieposiadający podwójnego krzyżyka (w tym motłoch) otrzymają premię za łączną wygraną wszystkich podwójnych krzyżujących podzieloną przez całkowitą liczbę niedopasujących podwójnie. Innymi słowy, spisek stał się zbyt duży, aby zachować tajemnicę, spiskowcy zostali wykorzenieni i wykluczeni z napadu, a wszyscy podzielili się stawkami za karę - a ich reputacja z powodu nieuczciwego czynienia również straciła pracę.
      • Odpowiedź „palca” (jak w „dotykaniu szczura podwójnie krzyżującego łajdaka”), jeśli napad się powiedzie, da graczowi osiem możliwości (równomierne losowanie z zastąpieniem zestawu nie-motłochu), aby zidentyfikować podwójnego crosser, który nie został jeszcze tak zidentyfikowany .
        • Każdy podwójny krzyżowiec zidentyfikowany w ten sposób natychmiast zapłaci palcicielowi 25% swoich bieżących zasobów kredytowych (w zaokrągleniu w dół) zamiast zostać zastrzelonym, stracić pracę i obniżyć wypłatę o połowę (ponieważ szef nie będzie tolerował złego zachowania) i stracisz 5% prawdopodobieństwa zwycięstwa w napadzie na bank (ponieważ inne napady są szczególnie podejrzane w przyszłości i prawdopodobnie wyrzucą je pod autobus, jeśli coś stanie się owłosione). Identyfikatory podwójnego krzyża zidentyfikowane w ten sposób nie wpływają na to, czy podwójny krzyż był udany dla innych podwójnych krzyżowców, ale nie otrzymują żadnego skradzionego kredytu z podwójnego krzyża, a wspomniane skradzione kredyty zostaną ponownie rozdzielone na osoby niebędące podwójne krzyże.
        • Jeśli w ten sposób nie zostanie zidentyfikowany podwójny krzyżowiec, znicz otrzyma szwy za marnowanie czasu każdego - a także zapłaci połowę swojej wygranej z obecnego skoku, obniży wypłatę o 5% (szef skraca godziny tattletale) i przegra 5% kursów bukmacherskich w obecnym banku (ponieważ inne spadkobiercy rzadziej będą hojni / uczciwi ze swoimi wygranymi w przyszłości). Połowa wygranych w ten sposób utraconych zostanie rozdzielona między niebezpośrednich podwójnych krzyżujących, jeśli podwójny krzyżowy się powiedzie, lub nie-podwójnych krzyżowych (w tym motłoch), jeśli podwójny krzyżowy się nie uda.

Banki

Bank jest wybierany za pomocą indeksu numheisters + int(totalamountbet/100000), gdzie numheisters to liczba graczy, którzy postawili dodatnią stawkę w rundzie 1, a totalamountbet to suma stawek wszystkich tych graczy. Innymi słowy, sto tysięcy kredytów to tyle, co 1 dodatkowy dziedzic. Na podstawie tego indeksu zostanie wybrany jeden z następujących banków, bank o najwyższym progu, który wskaźnik osiąga lub przekracza:

Bank             Index Threshold   Victory Prob.  Bet Odds
----             ---------------   -------------  --------
0:Municipal                    0           0.540      0.80
1:City                        20           0.488      1.10
2:State                       40           0.425      1.30
3:National                    60           0.387      1.65
4:Federal Reserve             80           0.324      1.95

Pamiętaj, że w miarę trwania turnieju prawdopodobieństwo osiągnięcia najwyższego poziomu banku wzrośnie, ponieważ kwota, którą każdy gracz może postawić, będzie rosła. Zauważ też, że są to tylko początkowe szanse i prawdopodobieństwa, zanim zostaną zmodyfikowane przez jakiekolwiek działania „zdobądź dane wywiadowcze” lub „kup strażnika”. Przy początkowych prawdopodobieństwach i szansach tylko miasto i banki krajowe oczekiwały wygranych przekraczających spodziewane straty.

The Rabble

  • W turnieju bierze również udział 500 innych graczy, zwanych „motłochem”, którzy uczestniczą jako zwykli gracze w napadach, ale na koniec nie są punktowani. Dzięki temu każda gra jest inna i nieco mniej przewidywalna, a także umożliwia dotarcie do bardziej ryzykownych / bardziej satysfakcjonujących banków, nawet z kilkoma „prawdziwymi” graczami.
  • Każda gra będzie zawierać pewien podzbiór motłochu, który będzie losowo wybrany równomiernie we wszystkich podgrupach motłochu.
  • Wszyscy motłoch używają następującej strategii:
    • Losowo wybieraj zakłady z prawdopodobieństwem równym prawdopodobieństwu sukcesu w banku, które zostanie wybrane na podstawie decyzji graczy, którzy już podjęli decyzję w tej rundzie .
    • Jeśli obstawiasz niezerową kwotę, wybierz największą z następujących kwot, które nie przekraczałyby jej obecnych udziałów: 69, 420, 6969, 80085.
    • W drugiej rundzie „wycofaj się” z prawdopodobieństwem równym 5% plus 50% odsetka graczy, którzy już się wycofali, w przeciwnym razie napad jest normalny. (Pamiętaj, że oznacza to, że wcześni gracze w drugiej rundzie, którzy się wycofują, mogą mieć ogromne efekty kaskadowe wśród motłochu - uważaj i przygotuj się na upadek napadu, zanim jeszcze się zacznie.)

Wejścia i wyjścia

W obu rundach programy otrzymają następujące informacje, w dokładnie takiej kolejności, jak argumenty wiersza poleceń . O ile nie podano inaczej, wszystkie wartości są liczbami całkowitymi nie zawierającymi liczb dziesiętnych.

  1. Aktualny numer gry (indeksowany od zera)
  2. Okrągła liczba bieżącej gry (1 lub 2)
  3. Liczba graczy w bieżącej grze (w tym motłoch).
  4. Liczba graczy, którzy już wykonali swoje tury w tej rundzie.
  5. Liczba spadkobierców, którzy do tej pory złożyli pozytywny udział. (W drugiej rundzie będzie to faktycznie całkowita liczba heisterów, którzy kupili w pierwszej rundzie).
  6. Łączna liczba dotychczas zainwestowanych kredytów. (W drugiej rundzie, to rzeczywiście będzie łączna liczba punktów zainwestowanych w pierwszej rundzie - w szczególności nie zawierają więcej niż początkowych udziałów „all in” heisters i nie obejmują udziały „wycofać” spadkobiercy).
  7. Liczba spadkobierców, którzy potwierdzili w drugiej rundzie (tj. Nie wycofali się). Będzie to zero w pierwszej rundzie.
  8. (Indeksowany zerem) numer banku, który zostanie napadnięty (w pierwszej rundzie bank, który zostałby napadnięty, gdyby nikt inny nie postawił zakładu)
  9. Liczba kredytów aktualnie dostępnych dla gracza.
  10. Liczba kredytów postawionych przez gracza w pierwszej rundzie. (W pierwszej rundzie jest to zawsze zero).
  11. Liczba kredytów, które gracz otrzyma w ramach wypłaty na koniec każdej gry.
  12. 1, jeśli gracz aktualnie otrzymuje wypłatę, 0, jeśli gracz jest bezrobotny
  13. Pozycja gracza w tabeli liderów (nie licząc motłochu) na koniec poprzedniej gry, 1-indeksowana. (Zdefiniowane jako 1 + liczba graczy o znacznie większej liczbie kredytów w tym czasie. Np. Podczas pierwszej gry wszyscy gracze mają rangę 1.)
  14. Średnia liczba punktów posiadanych przez wszystkich graczy (nie licząc motłochu) (reprezentowana jako liczba dziesiętna)
  15. Średnie bezwzględne odchylenie liczby punktów posiadanych przez wszystkich graczy (nie licząc motłochu) (reprezentowane jako liczba dziesiętna)
  16. Maksymalna liczba kredytów posiadanych przez dowolnego gracza (tj. Liczba kredytów posiadanych przez gracza o randze 1, nie licząc motłochu)
  17. Liczba kredytów, które gracz przechował na koncie banku 0
  18. Konto bankowe 1
  19. Rachunek banku 2
  20. Rachunek banku 3
  21. Rachunek banku 4
  22. Indywidualne prawdopodobieństwo zwycięstwa gracza na poziomie 0
  23. Prawdopodobieństwo dla banku 1
  24. Prawdopodobieństwo dla banku 2
  25. Prawdopodobieństwo dla banku 3
  26. Prawdopodobieństwo dla banku 4
  27. Indywidualne szanse wypłaty gracza po udanym skoku w banku 0
  28. Kursy na bank 1
  29. Kursy na bank 2
  30. Bank 3 szanse
  31. Kursy na bank 4

W pierwszej rundzie gry program gracza musi wydrukować, aby ustawić liczbę całkowitą od 0 do całkowitej liczby kredytów na koncie tego gracza. Każda kwota zakładu większa niż dostępne saldo kredytowe jest uważana za zakład maksymalny. Wszelkie inne dane wyjściowe (lub warunki błędu) będą interpretowane jako zakład zerowy.

W drugiej rundzie gry program gracza musi wydrukować, aby rozpocząć ciąg, jak opisano w sekcji „Druga runda licytacji” powyżej. Domyślnym działaniem jest warunek błędu: wykonaj napad jak zwykle.

Kontroler

Turniej zostanie przeprowadzony przy użyciu tego kontrolera . Przykłady botów również tam. Wciąż testowane. Więcej kodu w przyszłości. Prześlij poprawki błędów (na github). Zostanie zaktualizowany, jeśli zmienią się również jakieś zasady.

Aby uruchomić pojedynczy turniej na własnym komputerze, dodaj linię do konkurenci.txt, a następnie użyj:

python bankheist.py 1000

Zasady konkursu

  • Gracze mogą przesyłać dowolną liczbę programów graczy w dowolnym swobodnie dostępnym języku, którego programy mogą otrzymywać argumenty wiersza poleceń.
  • Zgłoszenia muszą zawierać dość wyraźne instrukcje dotyczące kompilowania programów i uruchamiania ich na komputerze, w tym nazwy potrzebnych narzędzi i dokładne polecenia, które należy wydać. Zgłoszenie musi zawierać co najmniej jedno polecenie, które wykonuje program i może mieć dołączone bezpośrednio do niego argumenty wiersza poleceń.
  • Zgłoszenia muszą również mieć unikalną nazwę, aby je zidentyfikować (która nie zawiera spacji).
  • Programy muszą działać w stosunkowo krótkim czasie. (Nie ustalam górnej granicy tego, co jest rozsądne. Raczej po prostu doradzę twórcy każdego wpisu, który wydaje się mieć czas realizacji zbyt duży, aby go przyspieszyć.)
  • Programy nie mogą odczytywać ani zapisywać plików. Nie mogą też używać żadnej innej metody przechowywania informacji między seriami. Celem tego wyzwania jest podejmowanie złożonych decyzji na podstawie ograniczonych / podsumowanych informacji.
  • Wszelkie te zasady mogą ulec zmianie w dowolnym momencie, jeśli to konieczne. Na górze tego postu zostanie dodana wiadomość wskazująca wszelkie takie zmiany.
  • Konkurs kończy się nie wcześniej niż tydzień po tym, jak ostatni użytkownik opublikuje swoje pierwsze zgłoszenie . Modyfikacje istniejących zgłoszeń są dozwolone w dowolnym momencie, aż do zakończenia konkursu. Dołożę wszelkich starań, aby aktualny termin był aktualizowany w wiadomości na górze tego postu.
  • Konkurs kończy się nie wcześniej niż tydzień po ostatniej zmianie regulaminu, jeśli taka istnieje. Dołożę wszelkich starań, aby pozostawić komentarze wszystkim użytkownikom, których dotyczą zmiany zasad.
  • Lepiej się założę, że osobiście wezmę udział w tym konkursie. ;)
kwintopia
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Dennis
Może dlatego, że nie jestem zaznajomiony z grą Twitch lub Heist, ale istnieje wiele zasad, które najlepiej można zademonstrować za pomocą małych sprawdzonych przykładów. W tej chwili wydaje się to mało przystępne.
Moogie,
Król wzgórza? Nie słyszałem tego imienia od lat.
Beta Decay

Odpowiedzi:

6

Niektóre „złe” przykłady programów.

Oto niektóre boty, które napisałem, aby przetestować kontroler. Przeważnie robią tylko minimalną niezbędną rzecz, aby przetestować jeden konkretny rodzaj działania. W zależności od poziomu uczestnictwa w tym KotH, w finałowym turnieju znajdzie się od kilku do wszystkich, ponieważ duża część strategii w grze będzie polegać na zachowaniu wielu różnych botów.

Podaję je wszystkie tutaj głównie jako przykłady użycia.

Lurker

Nigdy nie stawiaj. Jeśli tego nie pokonujesz, przemyśl swoją strategię.

print 0

PassivePanga

Zawsze obstawiaj 69.

import sys


round = int(sys.argv[2])
myyattas = int(sys.argv[9])
if round == 1:
    if myyattas > 69:
        print "69"
    else:
        print "0"
else:
    print "!guncheck"

KaylorrCriterion

Postaw zakład Kelly tylko wtedy, gdy spełnione jest kryterium Kelly. Ponieważ rzadko zdarza się to, gdy najpierw wykonuje się kilka czynności „zdobywaj dane wywiadowcze” i „kupuj straż”, zazwyczaj uzyskuje się taki sam wynik jak Lurker.

import sys
import ast
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

def get_bank(bettors,credits):
    selector = min(4,int(bettors+int(credits/100000.)/20))
    return bankprobs[selector],bankodds[selector]



if round == 1:
    if alreadyplayed < 0.37*numplayers or numbet==0:
        print 0
        #sys.stderr.write("1: %d,%d\n"%(alreadyplayed,numbet))
    else:
        ratiosofar = numbet/float(alreadyplayed)
        bettors = ratiosofar * numplayers
        ratesofar = yattasbet/float(numbet)
        credits = bettors*ratesofar
        p,b = get_bank(bettors,credits)
        f = (p*(b+1)-1)/b
        print max(int(f*myyattas),0)
        #sys.stderr.write("2: %d,%d\n"%(p,b))
else:
    if alreadyplayed < 0.37*numbet or numbet==0:
        print "!guncheck"
    else:
        p,b = get_bank(numbet,yattasbet)
        realp = p*numready/float(alreadyplayed)
        f = (realp*(b+1)-(1-240./(myyattas+240.)))/b
        print "!guncheck" if f>0 else "back out"

gunHeCK

Zrób zakład Kelly wtedy i tylko wtedy, gdy liczba heisters widzianych dotąd wskazują, że zakład będzie spełniać kryterium Kelly (ale nie wycofać jeśli źle). Zwykle robi się gorzej niż Lurker

import sys
import ast
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

def get_bank(bettors,credits):
    selector = min(4,int(bettors+int(credits/100000.)/20))
    return bankprobs[selector],bankodds[selector]

if round == 1:
    if alreadyplayed < 0.37*numplayers or numbet==0:
        print 0
        #sys.stderr.write("1: %d,%d\n"%(alreadyplayed,numbet))
    else:
        ratiosofar = numbet/float(alreadyplayed)
        bettors = ratiosofar * numplayers
        ratesofar = yattasbet/float(numbet)
        credits = bettors*ratesofar
        p,b = get_bank(bettors,credits)
        f = (p*(b+1)-1)/b
        print max(int(f*myyattas),0)
        #sys.stderr.write("2: %d,%d\n"%(p,b))
else:
    print "!gunHeCK"

Moni's Adddiction

Idź „all in”, chyba że już wygrałeś.

import sys
import random


round = int(sys.argv[2])
myrank = int(sys.argv[13])
mybet = int(sys.argv[10])

if round == 1:
    if random.random()<0.1:
        print 1
    else:
        print 69
else:
    if myrank>1:
        print "all in"
    else:
        if mybet==1:
            print "back out"
        else:
            print "!guncheck"

HeCKuSumer

Zawsze stawiaj mały stały ułamek zakładów.

import sys

round = int(sys.argv[2])
myyattas = int(sys.argv[9])

if round==1:
    print int(0.1*myyattas)
else:
    print "!guncheck"

OC'sRandomTpyos

Bardzo często zmieniaj miejsca pracy we wczesnym turnieju. Wydaj wszystkie pieniądze na poprawę prawdopodobieństw i szans. Później spędź kilka ostatnich gier, wchodząc all-in. Prawdopodobnie byłoby dużo lepiej bez wchodzenia all-in, chyba że byłbyś na pierwszym miejscu.

import sys
import ast
import random

game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round == 1:
    if game<800 or myrank>3:
        print 1
    else:
        print myyattas/4
else:
    if game<800:
        if hired:
            print "change jobs"
        else:
            print random.choice(["acquire intel","buy guard"])
    else:
        if myrank>3:
            print "all in"
        else:
            print "!guncheck"

HardHatUmar

W miarę możliwości zmienia zadania przez większość turnieju. Unika bukmacherów więcej niż minimum konieczne. Ma się całkiem dobrze, ale nie świetnie.

import sys

game = int(sys.argv[1])
round = int(sys.argv[2])
hired = int(sys.argv[12])

if round==1:
    if game < 900 and hired:
        print 1
    else:
        print 0
else:
    print "change jobs"

LimeadeSneaktar

W miarę możliwości zmieniaj oferty pracy podczas pierwszej części turnieju. Spędź co drugą grę podwójne przejście. Dobrze radzi sobie nawet przeciwko SnitcherKing. Prawdopodobnie będzie gorzej, gdy wiele innych botów będzie podwójnie krzyżowało się i palcowało. Jeśli nie - zasady mogą wymagać zmiany.

import sys
import ast

game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round==1:
    print 1
else:
    if hired and game<900:
        print "change jobs"
    else:
        print "double cross"

SnitcherKing

Zawsze stawiaj minimum i zawsze palec. Radzi sobie dobrze w małych turniejach, w tym LimeadeSneaktar.

import sys

round = int(sys.argv[2])

if round == 1:
    print 1
else:
    print "finger"

RaysFive01K

Trochę bardziej skomplikowane - a zatem całkiem niezłe. Największą zaletą jest zdeponowanie wszystkich wygranych na wczesnym etapie turnieju (ochrona ich przed podwójnymi krzyżownikami) przy jednoczesnym zwiększeniu prawdopodobieństwa wygranej (i zmianie pracy, aby zapłacić za wszystkich tych strażników i napady), a następnie wycofanie ich wszystkich na koniec gry ( gdy już wzbudzą poważne zainteresowanie, a prawdopodobieństwo niezrealizowania wypłaty jest wystarczająco niskie - choć tutaj straty w podwójnych krzyżakach stanowią poważne ryzyko). To na pewno będzie w turnieju i może być poważnym przeciwnikiem.

import sys
import ast
import random
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])

bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round ==1:
    if game < 900:
        print myyattas/10
    else:
        print 1
else:
    if game < 500 and hired:
        print random.choice(["change jobs","finger","buy guard"])
    elif game < 900:
        print "deposit"
    elif bankholdings[bankid]>0:
        print "withdraw"
    else:
        if alreadyplayed/float(numplayers)<0.5:
            print "finger"
        else:
            print "back out"
kwintopia
źródło
Pochwalam tych nameings <Insert drgać i panga memów>
CAD97
2

Samotny John

import sys
import ast

game,round,numplayers,alreadyplayed,numbet,creditsbet,numready,bankid,mycredits,mybet,mypayment,hired,myrank,mu_credits,sigma_credits,max_credits = map(ast.literal_eval,sys.argv[1:17])

bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round == 1:
    if mycredits > 100 or hired:
        print(int(mycredits)/2)
    else:
        print(0)
else:
    if bankprobs[int(bankid)] > 0.6:
        print("all in")
    elif int(mypayment) > 50 :
        print("buy guard")
    elif int(mycredits) > 200 and int(game) < 900 and hired == "1":
        print("change jobs")
    elif bankprobs[int(bankid)] * (float(numready)+1)/(float(alreadyplayed)+1) < 0.30:
        print "withdraw"
    else:
        print "!guncheck"

Przekupuje strażników, dopóki nie wygra, a następnie wchodzi all-in. Sam.

Zmienia pracę, gdy potrzebuje więcej pieniędzy, aby przekupić strażników.

MegaTom
źródło
jak nazywa się ten gracz?
kwintopia
@quintopia ops! Zapomniałem, że udało mi się to opublikować! Dodano nazwę i wyjaśnienie.
MegaTom
Ładny. Tak samo jak wskazówka, nie musisz robić wszystkich tych typecastów. Wszystko jest już właściwego rodzaju, od momentu ewaluacji od samego początku. Co oznacza, że ​​warunek hired == "1"zawsze będzie fałszywy i nigdy nie zmieni zleceń.
kwintopia
Właśnie przeprowadziłem to w jednej rundzie przeciwko wszystkim innym, które zrobiłem. Przybył na ostatnie miejsce. Pech :(
kwintopia