König des Hügels: Bankraub


15

Beispiellauf hinzugefügt 4/11

Klarstellung der Regeln 4/8: Alle Einsendungen nehmen an einem riesigen, kostenlosen Turnier teil, das aus so vielen Matches besteht, wie mein Computer in 48 Stunden durchführen kann.

Jeder, der sich auf Twitch Streams angesehen hat, ist sich der Verbreitung von DeepBot bewusst und kennt vielleicht sogar das Bank-Heist- Tippspiel . Dieses King of the Hill-Turnier ist direkt von diesem Spiel inspiriert. Mach dir aber keine Sorgen. Ich glaube, ich habe genug zusätzliche Knicke in diese Version gesteckt, um die Dinge interessant zu halten.

Ein kurzes Beispiel

#####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.

Spielregeln

Turnier / Spielstruktur

  • Das Turnier wird aus einer Reihe von Spielen bestehen, die nach dem Zufallsprinzip zwischen 1000 und 1100 ausgewählt werden und bei denen jede ernsthafte Einreichung gleichzeitig an einem Free-for-All-Wettbewerb teilnimmt.
  • Jeder Spieler beginnt das erste Spiel mit 240 Credits und jedes nachfolgende Spiel mit der Anzahl Credits, die er am Ende des vorherigen Spiels hatte.
  • Jedes Spiel besteht aus 2 Runden. In jeder Runde werden die Spieler in einer zufällig festgelegten Reihenfolge aufgerufen, um eine Entscheidung zu treffen:
    • In der ersten Runde kann ein Spieler eine beliebige Anzahl von Krediten zwischen 0 und seinem aktuellen Kreditbestand auszahlen, um an einem Banküberfall teilzunehmen.
    • In der zweiten Runde kann jeder Spieler, der sich für die Teilnahme an dem Überfall entschieden hat, indem er mindestens ein Guthaben eingesetzt hat (im Folgenden "heisters" genannt), beschließen, seine Wette fahren zu lassen (und dabei möglicherweise eine andere Aktion auszuführen). Deaktivieren Sie den Überfall oder gehen Sie All-In. (Diese Optionen werden weiter unten beschrieben.)
  • Basierend auf der Anzahl der Überfälle und der Gesamtzahl der von ihnen bezahlten Kredite wird eine von fünf Banken ausgewählt, bei denen ein Überfall durchgeführt werden soll. Diese Auswahl beeinflusst die individuelle Gewinnwahrscheinlichkeit und die Gewinnchancen, anhand derer die Auszahlung bestimmt wird. (Die Banken sind unten beschrieben.)
  • Jeder Heister, der sich nicht abgemeldet hat, gewinnt mit der (modifizierten) Wahrscheinlichkeit der Bank seinen Einsatz multipliziert mit den (modifizierten) Wettquoten der Bank (abgerundet) oder verliert seinen Einsatz. Beachten Sie, dass der Erfolg oder Misserfolg jedes Spielers individuell bestimmt wird - einige werden erfolgreich sein, wenn andere fehlschlagen.
  • Alle Spieler, ob sie teilgenommen haben oder nicht, haben es geschafft oder sind gescheitert, erhalten dann einen Gehaltsscheck (mit den unten beschriebenen Ausnahmen).
  • Beachten Sie, dass es nicht möglich ist, das Spiel dauerhaft zu verlassen. Im schlimmsten Fall muss ein Spieler ein Spiel abwarten, um seinen nächsten Gehaltsscheck zu erhalten.
  • Nach 1000 bis 1100 Spielen wird der Spieler mit den meisten Credits zum Gewinner dieses Turniers erklärt.
  • Das Turnier wird eine nicht festgelegte Anzahl von Malen wiederholt (so viele wie innerhalb von 48 Stunden berechnet werden können) und die Spielergewinne aller Turniere werden summiert, um den Gesamtsieger dieses Wettbewerbs zu ermitteln.

Die zweite Einsatzrunde

  • Jeder Spieler, der in der ersten Runde einen positiven Einsatz gemacht hat, kann an der zweiten Runde teilnehmen.
  • In dieser Runde darf ein Spieler:
    • reply with the string "back out" to cancel its bet. This will set its wager to zero for the current heist and also slightly decrease the probability the players remaining in the heist will succeed. By taking this option, a player forgoes the 240 credit paycheck that follows the heist as punishment for putting the remaining heisters at risk. (The remaining heisters will succeed with a probability equal to the bank's probability times the fraction of heisters that did not "back out".)
    • Antworten Sie mit der Zeichenfolge "all in", um den gesamten Kreditbestand zu sprengen - und nehmen Sie einen Zahltag-Kredit für den nächsten 240-Kredit-Gehaltsscheck auf -, um die beste Ausrüstung und die besten Informationen für einen Überfall zu kaufen und gehen Sie mit lodernden Waffen allein hinein, ohne sich auf jemanden verlassen. Die Siegwahrscheinlichkeit eines solchen Spielers kann weder durch andere Überfälle beeinträchtigt werden, noch können seine Gewinne von Double Crossern gestohlen werden. Die Gewinnauszahlungen werden so ermittelt, als ob die Wette die gesamten Guthabenbestände plus 240 wäre, während der Verlust die Bestände auf Null setzt.
    • Antworten Sie mit einer beliebigen anderen Zeichenfolge (einschließlich der leeren Zeichenfolge), um die vorherige Wette beizubehalten und den Überfall wie gewohnt durchzuführen. (Empfohlene Antwort: "! Guncheck"). Bestimmte Antworten haben zusätzliche Nebenwirkungen:
      • Eine Antwort auf "Jobs ändern" veranlasst den Spieler, seinen Job zu beenden. Zu Beginn dieser Runde hat der Spieler am Ende jeder Runde eine Chance von 5%, an einer neuen Position eingestellt zu werden. Gelingt dies, wird der Spieler eingestellt und erhält sofort seinen ersten Gehaltsscheck. Jeder neue Job zahlt garantiert genau 5% mehr als der letzte (abgerundet). Diese Aktion wird erfolgreich sein, unabhängig davon, ob der Überfall erfolgreich ist oder nicht.
      • Eine Antwort von "Intel erwerben" bewirkt, dass der Spieler, wenn der Überfall erfolgreich ist, all seine Gewinne von diesem Überfall ausgibt, um zusätzliche 0,00001 pro Guthaben zu erhalten, das auf die Quoten für die Bank verwendet wird, die nur für diesen Spieler überfallen wurde . Diese Quotenänderung ist permanent. Wenn zum Beispiel ein Spieler diese Aktion wählt, wenn er Bank 1 überfällt und 6969 Credits in einem Überfall gewinnt, werden die Quoten von Bank 1 für diesen Spieler dauerhaft um 0,06969 erhöht und der Spieler erhält nichts von diesem Überfall.
      • Eine Antwort von "Wächter kaufen" veranlasst den Spieler, einen der Wächter bei der Bank, die überfallen wird, zu kaufen. Als Gegenleistung für eine dauerhafte Reduzierung des Gehaltsschecks dieses Spielers um 1 Kreditpunkt (das reguläre Bestechungsgeld des Wächters) erhält der Spieler eine "dauerhaft" erhöhte Siegwahrscheinlichkeit bei dieser Bank (da der Wächter "vergisst", diesen Spieler den Polizisten gegenüber zu erwähnen, wenn fragte). Die Wahrscheinlichkeit erhöht sich um genau 1% der Differenz zwischen der aktuellen Siegwahrscheinlichkeit des Spielers bei dieser Bank und 100%. Diese Aktion ist auch dann erfolgreich, wenn der Überfall fehlschlägt. HINWEIS: Wenn ein Spieler zu irgendeinem Zeitpunkt nicht über genügend Guthaben verfügt, um alle seine Wachbestechungsgelder zu zahlen, verliert er sofort und "dauerhaft" so viele Wahrscheinlichkeitsboni wie die Anzahl der Bestechungsgelder, die nicht ausgezahlt werden konnten.
      • Eine Antwort auf "Einzahlung" hinterlässt, wenn der Überfall erfolgreich ist, den gesamten Gewinn eines Spielers auf einem Konto bei der überfallenen Bank. Die Credits sind für keinen Zweck zugänglich und werden nicht für die Punktzahl eines Spielers gezählt, bis sie ausgezahlt werden. Dieses Konto zahlt Zinsen in Höhe von 0,14% pro Spiel.
      • Die Antwort "Zurückziehen" erhöht bei einem erfolgreichen Überfall den Gewinn eines Spielers um den gesamten Inhalt seines Kontos bei der überfallenen Bank. Das Konto wird daraufhin auf Null gesetzt. Beachten Sie, dass diese zusätzlichen Gewinne können durch einen Doppelklick crossers gestohlen werden.
      • Eine Antwort von "Doppelkreuz" wird eines von zwei Dingen tun:
        • Wenn die Anzahl der Raubüberfälle, die "Double Cross" gespielt haben, höchstens 1/10 (abgerundet) der Gesamtzahl der Nicht-Raubüberfälle beträgt, die sich für den Raubüberfall entschieden haben (oder genau einer, wenn es weniger als 10 solche Spieler gibt) ) erhält der Spieler einen zusätzlichen Gewinn in Höhe des Gesamtgewinns aller Nicht-Double-Crosser geteilt durch die Anzahl der Double-Crosser (abgerundet). Alle Nicht-Doppelgänger erhalten in diesem Fall 0 Credits vom Überfall. Mit anderen Worten, die Double Crosser stehlen die Kredite aller anderen und teilen sie gleichmäßig auf sich auf.
        • Wenn die Anzahl der Überfälle, die "Double Cross" gespielt haben, die Schwelle überschreitet, erhält der Spieler keine Gewinne (wenn sein Überfall erfolgreich war), der Gehaltsscheck wird halbiert und er wird entlassen. (Siehe "Jobs wechseln".) In diesem Fall erhalten alle Nicht-Double-Crosser (einschließlich Rabbel) eine Bonuszahlung auf den Gesamtgewinn aller Double-Crosser geteilt durch die Gesamtzahl der Nicht-Double-Crosser. Mit anderen Worten, die Verschwörung wurde zu groß, um sie geheim zu halten, die Verschwörer wurden ausgerottet und vom Raub ausgeschlossen, und jeder teilte seinen Einsatz für die Bestrafung auf - und ihr Ruf für schmutzige Geschäfte verlor auch ihre Arbeit.
      • Eine Antwort von "finger" (wie bei "Fingern einer doppelt überkreuzten Schurkenratte") gibt dem Spieler acht Möglichkeiten, bei erfolgreichem Überfall (einheitliches Ziehen durch Ersetzen aus dem Satz der Nicht-Schurken-Überfälle) einen Doppelgänger zu identifizieren. Crosser, der noch nicht so identifiziert wurde .
        • Jeder auf diese Weise identifizierte Double Crosser zahlt dem Finger sofort 25% seines aktuellen Guthabens (abgerundet), anstatt erschossen zu werden, verliert seinen Job und lässt seinen Gehaltsscheck halbieren (weil der Chef schlechtes Benehmen nicht toleriert). und verlieren 5% der Wahrscheinlichkeit eines Sieges, wenn die Bank überfallen wird (da andere Überfälle in Zukunft besonders verdächtig sind und sie wahrscheinlich unter den Bus werfen, wenn es haarig wird). Auf diese Weise identifizierte Doppelkreuzer haben keinen Einfluss darauf, ob das Doppelkreuz für andere Doppelkreuzer erfolgreich war, aber sie erhalten kein gestohlenes Guthaben des Doppelkreuzes. Die gestohlenen Guthaben werden an die Nicht-Doppelkreuzer zurückverteilt. Doppelgänger.
        • Wenn auf diese Weise keine Doppelgänger identifiziert werden, wird der Schnatz für die Verschwendung von Zeit genäht - und zahlt auch die Hälfte seines Gewinns aus dem aktuellen Überfall, erhält einen 5% -igen Abschlag auf seinen Gehaltsscheck (der Chef kürzt die Stunden des Tattletales) und verliert 5% der Wettquoten bei der aktuellen Bank (da andere Heister in Zukunft weniger großzügig / fair mit ihren Gewinnen sein dürften). Die Hälfte der so verlorenen Gewinne wird an die nicht gefingerten Double Crosser verteilt, wenn die Double Crosser erfolgreich waren, oder an die Nicht-Double Crosser (einschließlich Rabble), wenn die Double Crosser gescheitert sind.

Die Banken

Die Bank wird anhand des Index ausgewählt numheisters + int(totalamountbet/100000), wobei numheisters die Anzahl der Spieler ist, die in Runde 1 einen positiven Einsatz gemacht haben, und totalamountbet die Summe der Einsätze aller dieser Spieler. Mit anderen Worten, einhunderttausend Credits sind so gut wie ein zusätzlicher Heister. Basierend auf diesem Index wird eine der folgenden Banken ausgewählt, die Bank mit dem höchsten Schwellenwert, den der Index erreicht oder überschreitet:

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

Beachten Sie, dass im weiteren Verlauf eines Turniers die Wahrscheinlichkeit zunimmt, dass die höchste Bankstufe erreicht wird, da jeder Spieler einen Aufwärtstrend setzen kann. Beachten Sie auch, dass dies nur anfängliche Chancen und Wahrscheinlichkeiten sind, bevor sie durch eine Aktion zum "Erwerben von Informationen" oder "Kaufen einer Wache" geändert wurden. Mit den anfänglichen Wahrscheinlichkeiten und Chancen haben nur die Banken der Stadt und des Bundes erwartet, dass die Gewinne die erwarteten Verluste übersteigen.

Das Gesindel

  • Das Turnier enthält auch 500 andere Spieler, die "Rabble" genannt werden und als reguläre Spieler an Überfällen teilnehmen, aber am Ende nicht gewertet werden. Diese dienen dazu, jedes Spiel anders und etwas weniger vorhersehbar zu machen und es zu ermöglichen, die riskanteren / lohnenderen Banken auch mit nur wenigen "echten" Spielern zu erreichen.
  • Jedes Spiel wird eine Untergruppe von Gesindel enthalten, um gleichmäßig zufällig über alle Untergruppen von Gesindel ausgewählt teilzunehmen.
  • Alle Gesindel verwenden die folgende Strategie:
    • Wählen Sie nach dem Zufallsprinzip eine Wette mit einer Wahrscheinlichkeit, die der Erfolgswahrscheinlichkeit der Bank entspricht, die auf der Grundlage der Entscheidungen der Spieler ausgewählt wird , die ihre Entscheidung in dieser Runde bereits getroffen haben .
    • Wenn Sie einen Betrag ungleich Null setzen, wählen Sie den größten der folgenden Beträge aus, der den aktuellen Bestand nicht überschreiten würde: 69, 420, 6969, 80085.
    • In der zweiten Runde wird mit einer Wahrscheinlichkeit von 5% plus 50% des Anteils der Wettenden, die bereits zurückgetreten sind, "zurückgetreten", andernfalls wird wie üblich überfallen. (Beachten Sie, dass dies bedeutet, dass frühe Spieler in der zweiten Runde, die aussteigen, enorme Kaskadeneffekte beim Pöbel haben können - seien Sie vorsichtig und seien Sie bereit, dass der Überfall einbricht, bevor er überhaupt beginnt.)

Eingänge und Ausgänge

In beiden Runden erhalten Programme die folgenden Informationen in genau dieser Reihenfolge als Befehlszeilenargumente . Sofern nicht anders angegeben, sind alle Werte Ganzzahlen ohne Dezimalstelle.

  1. Die aktuelle Spielnummer (null-indiziert)
  2. Die Rundennummer des aktuellen Spiels (1 oder 2)
  3. Die Anzahl der Spieler im aktuellen Spiel (einschließlich Pöbel).
  4. Die Anzahl der Spieler, die in dieser Runde bereits an der Reihe waren.
  5. Die Anzahl der Heister, die bisher einen positiven Einsatz begangen haben. (In der zweiten Runde ist dies die Gesamtzahl der Heisters, die sich in der ersten Runde eingekauft haben.)
  6. Die Gesamtzahl der bisher investierten Kredite. (In der zweiten Runde, das wird tatsächlich die Gesamtzahl der Kredite in der ersten Runde investiert - insbesondere, es nicht nicht enthalten mehr als die ersten Einsätze von „all in“ Heisters und nicht zählen die Einsätze von „Rückzieher“ heisters.)
  7. Die Anzahl der Heister, die sich in der zweiten Runde bestätigt haben (dh nicht "zurückgezogen" haben). Dies wird in der ersten Runde Null sein.
  8. Die (null-indexierte) Nummer der Bank, die erbeutet werden soll (während der ersten Runde die Bank, die erbeutet werden würde, wenn sonst niemand wetten würde)
  9. Die Anzahl der Credits, die dem Spieler derzeit zur Verfügung stehen.
  10. Die Anzahl der Credits, die der Spieler in der ersten Runde gesetzt hat. (Dies ist in der ersten Runde immer Null.)
  11. Die Anzahl der Credits, die der Spieler am Ende jedes Spiels auf seinem Gehaltsscheck erhält.
  12. 1, wenn der Spieler gerade einen Gehaltsscheck erhält, 0, wenn der Spieler arbeitslos ist
  13. Rang des Spielers in der Rangliste (ohne Pöbel) am Ende des vorherigen Spiels, 1-indiziert. (Definiert als 1 + die Anzahl der Spieler mit zu diesem Zeitpunkt strikt mehr Credits. ZB während des ersten Spiels haben alle Spieler Rang 1.)
  14. Die durchschnittliche Anzahl der von allen Spielern gehaltenen Credits (ohne Rabble) (dargestellt als Dezimalzahl)
  15. Die mittlere absolute Abweichung in der Anzahl der von allen Spielern gehaltenen Credits (ohne Rabble) (dargestellt als Dezimalzahl)
  16. Die maximale Anzahl der Credits eines Spielers (dh die Anzahl der Credits eines Spielers mit Rang 1, ohne Rabble)
  17. Die Anzahl der Credits, die der Spieler auf dem Konto von Bank 0 gespeichert hat
  18. Bankkonto 1
  19. Bankkonto 2
  20. Bankkonto 3
  21. Bankkonto 4
  22. Die individuelle Gewinnwahrscheinlichkeit des Spielers bei Bank 0
  23. Bank 1 Wahrscheinlichkeit
  24. Bank 2 Wahrscheinlichkeit
  25. Bank 3 Wahrscheinlichkeit
  26. Bank 4 Wahrscheinlichkeit
  27. Die individuelle Auszahlungsquote des Spielers bei einem erfolgreichen Überfall bei Bank 0
  28. Bank 1 Gewinnchancen
  29. Bank 2 Gewinnchancen
  30. Bank 3 Gewinnchancen
  31. Bank 4 Gewinnchancen

In der ersten Runde eines Spiels muss ein Spielerprogramm so drucken, dass eine ganze Zahl zwischen 0 und der Gesamtzahl der Credits auf dem Konto dieses Spielers ausgegeben wird. Jeder Einsatzbetrag, der das verfügbare Guthaben übersteigt, wird als Maximaleinsatz angesehen. Jede andere Ausgabe (oder Fehlerbedingung) wird als Nullwette interpretiert.

In der zweiten Runde eines Spiels muss ein Spielerprogramm so drucken, dass eine Zeichenfolge ausgegeben wird, wie im Abschnitt "Die zweite Einsatzrunde" oben beschrieben. Eine Fehlerbedingung wird hier als Standardaktion angesehen: Gehen Sie mit dem Überfall wie gewohnt durch.

Regler

Das Turnier wird mit diesem Controller durchgeführt . Bot Beispiele gibt es auch. Wird noch getestet. Mehr Code kommt noch. Fühlen Sie sich frei, Fehlerbehebungen (auf Github) einzureichen. Wird aktualisiert, wenn sich auch Regeln ändern.

Wenn Sie ein einzelnes Turnier auf Ihrem eigenen Computer durchführen möchten, fügen Sie der Datei competitions.txt eine Zeile hinzu und verwenden Sie dann:

python bankheist.py 1000

Wettbewerbsregeln

  • Spieler können eine beliebige Anzahl von Spielerprogrammen in einer frei verfügbaren Sprache einreichen, deren Programme Befehlszeilenargumente erhalten können.
  • Die Einreichungen müssen ziemlich explizite Anweisungen zum Kompilieren und Ausführen von Programmen auf meinem PC enthalten, einschließlich der Namen der benötigten Tools und der genauen Befehle, die ausgegeben werden müssen. Die Übermittlung muss mindestens einen Befehl enthalten, der das Programm ausführt, und an den möglicherweise Befehlszeilenargumente direkt angehängt werden.
  • Einsendungen müssen auch einen eindeutigen Namen haben, um sie zu identifizieren (der keine Leerzeichen enthält).
  • Programme müssen in relativ kurzer Zeit ausgeführt werden. (Ich lege keine Obergrenze für das fest, was angemessen ist. Vielmehr werde ich dem Ersteller einfach jeden Eintrag empfehlen, der eine übergroße Ausführungszeit zu haben scheint, um ihn zu beschleunigen.)
  • Programme lesen oder schreiben möglicherweise nicht in Dateien. Sie dürfen auch keine andere Methode zum Speichern von Informationen zwischen Läufen verwenden. Ziel dieser Herausforderung ist es, komplexe Entscheidungen auf der Grundlage begrenzter / zusammengefasster Informationen zu treffen.
  • Alle diese Regeln können bei Bedarf jederzeit geändert werden. Am Anfang dieses Beitrags wird eine Nachricht hinzugefügt, die auf solche Änderungen hinweist.
  • Dieser Wettbewerb endet frühestens eine Woche, nachdem der letzte Benutzer seinen ersten Beitrag eingereicht hat . Änderungen bestehender Einsendungen sind bis zum Ende des Wettbewerbs jederzeit gestattet. Ich werde mein Bestes tun, um die aktuelle Frist in einer Nachricht oben in diesem Beitrag auf dem neuesten Stand zu halten .
  • Dieser Wettbewerb endet frühestens eine Woche nach der letzten Änderung der Regeln. Ich werde mein Bestes tun, um Kommentare für alle Benutzer zu hinterlassen, die von Regeländerungen betroffen sind.
  • Wetten, dass ich selbst an diesem Wettbewerb teilnehmen werde? ;)

Kommentare sind nicht für längere Diskussionen gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Dennis

Vielleicht, weil ich mit Zucken oder dem Überfallspiel nicht vertraut bin, aber es gibt viele Regeln, die am besten mit einem kleinen, ausgearbeiteten Beispiel demonstriert werden können. Im Moment scheint es nicht sehr zugänglich.
Moogie

König des Hügels? Ich habe diesen Namen seit Jahren nicht mehr gehört.
Beta Decay

Antworten:


6

Einige "schlechte" Beispiele für Programme.

Dies sind einige Bots, die ich geschrieben habe, um den Controller zu testen. Meistens tun sie nur das Notwendigste, um einen bestimmten Aktionstyp zu testen. Abhängig von der Höhe der Teilnahme an diesem KotH werden einige bis alle in die Endrunde einbezogen, da ein Großteil der Strategie im Spiel vom Umgang mit den Verhaltensweisen vieler verschiedener Bots abhängt.

Ich füge sie alle hier hauptsächlich als "Verwendungsbeispiele" ein.

Lurker

Wetten Sie niemals. Wenn Sie dies nicht schlagen, überdenken Sie Ihre Strategie.

print 0

PassivePanga

Wette immer 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

Machen Sie eine Kelly-Wette genau dann, wenn das Kelly-Kriterium erfüllt ist. Da dies nur selten der Fall ist, wenn Sie zuerst "Intel erwerben" und "Guard kaufen", erhalten Sie im Allgemeinen das gleiche Ergebnis wie bei 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

Machen Sie eine Kelly Wette , wenn und nur wenn die Zahl der Heisters bisher gesehen zeigen , dass die Wette wird das Kelly - Kriterium erfüllen (aber nicht wieder heraus , wenn falsch). Macht in der Regel schlimmer als 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'sAddiction

Gehen Sie "All In", sofern Sie nicht bereits gewinnen.

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"

HECKUSUMMER

Setzen Sie immer einen kleinen konstanten Bruchteil der Bestände.

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

Wechseln Sie zu Beginn des Turniers häufig den Job. Gib das ganze Geld aus, um Wahrscheinlichkeiten und Chancen zu verbessern. Verbringen Sie dann die letzten paar All-In-Spiele. Ohne das All-In wäre dies wahrscheinlich viel besser, es sei denn, Sie haben bereits einen Spitzenplatz belegt.

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

Wechselt während des größten Teils des Turniers nach Möglichkeit den Job. Vermeidet es, mehr als das erforderliche Minimum zu setzen. Geht anständig gut, aber nicht großartig.

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

Wechseln Sie während des ersten Teils des Turniers nach Möglichkeit den Job. Verbringen Sie jedes zweite Spiel Doppelkreuzung. Macht sich auch gegen SnitcherKing anständig. Wird wahrscheinlich schlechter abschneiden, wenn viele andere Bots doppelt kreuzen und fingern. Wenn nicht, müssen die Regeln möglicherweise geändert werden.

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

Setzen Sie immer auf das Minimum und immer mit dem Finger. Ist in kleinen Turnieren, die LimeadeSneaktar enthalten, ziemlich gut.

import sys

round = int(sys.argv[2])

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

RaysFive01K

Etwas komplizierter - und daher eigentlich ziemlich gut. Der größte Vorteil besteht darin, dass alle Gewinne zu Beginn des Turniers ausgezahlt werden (um sie vor Doppelkreuzen zu schützen), die Gewinnwahrscheinlichkeiten erhöht werden (und die Jobs gewechselt werden, um all diese Wachen und Überfälle zu bezahlen) und am Ende des Spiels alle Gewinne ausgezahlt werden ( Sobald sie ernsthaftes Interesse erlangt haben und die Wahrscheinlichkeit, dass sie sich nicht zurückziehen, ausreichend gering ist - wobei Verluste an Doppelgänger ein ernstes Risiko darstellen). Dies wird definitiv im Turnier sein und kann ein ernsthafter Anwärter sein oder auch nicht.

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"

Ich bin mit diesen Bezeichnungen einverstanden <füge Twitch & Panga Meme ein>
CAD97

2

Einsamer 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"

Bestechungswachen, bis er die Wahrscheinlichkeit hat, zu gewinnen, dann geht alles in. Alleine.

Wechselt den Job, wenn er mehr Geld braucht, um Wachen zu bestechen.


Wie heißt dieser Spieler?
Quintopia

@quintopia ops! Ich habe vergessen, dass ich den ganzen Weg zum Posten gekommen bin! Name und Erklärung hinzugefügt.
MegaTom

Nett. Nur als Tipp, Sie müssen nicht alle diese Typografien erstellen. Alles ist bereits der richtige Typ, nachdem es von Anfang an bewertet wurde. Dies bedeutet, dass die Bedingung hired == "1"immer falsch ist und niemals den Job wechselt.
Quintopia

Ich habe es nur in einer einzigen Runde gegen alle anderen gespielt, die ich gemacht habe. Kam an letzter Stelle. Pech :(
Quintopia
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.