Roi de la colline: Bank Heist

15

Exemple d'exécution ajouté le 4/11

Clarification des règles 4/8: Toutes les soumissions concourront dans un tournoi géant gratuit pour tous comprenant autant de matchs que mon ordinateur peut effectuer en 48 heures.

Quiconque a passé du temps à regarder des flux sur Twitch est conscient de la prévalence de DeepBot et est peut-être même familier avec son jeu de paris Bank Heist . Ce tournoi King of the Hill est directement inspiré de ce jeu. Mais ne vous inquiétez pas. Je pense que j'ai jeté assez de plis supplémentaires dans cette version pour garder les choses intéressantes.

Un exemple rapide

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

Regles du jeu

Tournoi / Structure du jeu

  • Le tournoi consistera en un certain nombre de jeux choisis uniformément au hasard entre 1000 et 1100, dans lesquels chaque soumission sérieuse concourra simultanément dans un tournoi gratuit pour tous.
  • Chaque joueur commence le premier jeu avec 240 crédits et chaque jeu suivant avec le nombre de crédits qu'il avait à la fin du jeu précédent.
  • Chaque jeu se déroule en 2 tours, et à chaque tour, les joueurs sont appelés dans un ordre déterminé uniformément au hasard pour prendre une décision:
    • Au premier tour, un joueur peut payer n'importe quel nombre entier de crédits entre 0 et ses avoirs de crédit actuels pour miser la participation à un braquage de banque.
    • Au deuxième tour, chaque joueur qui a choisi de participer au hold-up en misant au moins un crédit (ci-après dénommé "heisters") peut décider de laisser son pari rouler (et, ce faisant, éventuellement effectuer une autre action), désactivez le braquage ou faites tapis. (Ces options sont décrites plus en détail ci-dessous.)
  • En fonction du nombre d'historiens et du nombre total de crédits qu'ils ont payés, l'une des cinq banques est sélectionnée pour organiser un casse. Cette sélection affecte la probabilité individuelle de victoire et les chances de déterminer le paiement. (Les banques sont décrites ci-dessous.)
  • Chaque héritier qui ne s'est pas désengagé gagnera, avec la probabilité (modifiée) de la banque, sa mise multipliée par les cotes (modifiées) de la banque (arrondie vers le bas), ou bien perdra sa mise. Notez que le succès ou l'échec de chaque joueur est déterminé individuellement - certains réussiront là où d'autres échoueront.
  • Tous les joueurs, qu'ils aient participé ou non, ont réussi ou échoué, puis reçoivent un chèque de règlement (avec les exceptions décrites ci-dessous).
  • Notez qu'il est impossible de quitter définitivement le jeu. Au pire, un joueur peut devoir attendre une partie pour recevoir son prochain chèque de paie.
  • Après tous les matchs 1000-1100, le joueur avec le plus grand nombre de crédits sera déclaré vainqueur de ce tournoi.
  • Le tournoi sera répété un nombre indéterminé de fois (autant qu'il est possible de le calculer en 48 heures) et les gains des joueurs de tous les tournois seront additionnés afin de déterminer le vainqueur général de ce concours.

Le deuxième tour de paris

  • Tout joueur qui a misé une mise positive au premier tour peut participer au deuxième tour.
  • Dans ce tour, un joueur peut:
    • répondez avec la chaîne "back out" pour annuler sa mise. Cela mettra son pari à zéro pour le casse actuel et diminuera également légèrement la probabilité que les joueurs restant dans le casse réussissent. En prenant cette option, un joueur renonce au chèque de paie de 240 crédits qui suit le casse comme punition pour avoir mis les héritiers restants en danger. (Les héritiers restants réussiront avec une probabilité égale à la probabilité de la banque multipliée par la fraction des héritiers qui n'ont pas "reculé".)
    • répondre avec la chaîne "all in" pour faire exploser l'intégralité de ses avoirs de crédit - et contracter un prêt sur salaire sur son prochain chèque de paie de 240 crédits - pour acheter tous les meilleurs équipements et informations pour un braquage et y aller seul, les armes à feu flamboyantes, sans compter sur n'importe qui. La probabilité de victoire d'un tel joueur ne peut pas être affectée par le fait que d'autres héritiers abandonnent le cambriolage, et ses gains ne peuvent pas être volés par des double-crossers. Les gains gagnés seront déterminés comme si son pari était la totalité de ses avoirs de crédit plus 240, tandis que la perte mettrait ses avoirs à zéro.
    • Répondez avec n'importe quelle autre chaîne (y compris la chaîne vide) afin de vous en tenir à la mise précédente et de terminer le casse normalement. (Réponse recommandée: "! Guncheck"). Certaines réponses auront des effets secondaires supplémentaires:
      • Une réponse de "changement de travail" entraînera le joueur à quitter son travail. À partir de ce tour, à la fin de chaque tour, le joueur aura 5% de chances d'être embauché dans une nouvelle position. Si cela réussit, le joueur est embauché et reçoit immédiatement son premier chèque de paie. Chaque nouvel emploi est garanti de payer exactement 5% de plus que le dernier (arrondi vers le bas). Cette action réussira, que le braquage réussisse ou non.
      • Une réponse "acquérir des informations" entraînera, si le casse réussit, le joueur à dépenser tous ses gains de ce casse pour obtenir un 0,00001 supplémentaire par crédit ainsi dépensé sur les cotes de la banque qui a été tenue pour ce joueur uniquement . Cette modification de cotes est permanente. Par exemple, si un joueur choisit cette action en casquant la banque 1 et gagne 6969 crédits dans un coup, les chances de la banque 1 pour ce joueur seront augmentées de façon permanente de 0,06969 et le joueur ne recevra rien de ce coup.
      • Une réponse de "acheter un garde" amènera le joueur à acheter l'un des gardes de sécurité de la banque que vous avez cédée. En échange d'une réduction permanente de 1 crédit sur le chèque de paie de ce joueur (le pot-de-vin habituel du gardien), le joueur recevra une probabilité de victoire accrue "permanente" dans cette banque (car le garde "oublie de mentionner" ce joueur aux flics quand a demandé). La probabilité augmentera d'exactement 1% de la différence entre la probabilité de victoire actuelle du joueur dans cette banque et 100%. Cette action réussira même si le braquage échoue. NOTE: Si à tout moment, un joueur n'a pas assez de crédits pour payer tous ses pots-de-vin de garde, il perd immédiatement et "définitivement" autant de bonus de probabilité que le nombre de pots-de-vin qui n'ont pas pu être payés,
      • Une réponse de "dépôt", si le casse réussit, laissera l'intégralité des gains d'un joueur dans un compte à la banque cédée. Les crédits ne seront accessibles à aucune fin et ne seront pas comptés dans le score d'un joueur tant qu'ils ne seront pas retirés. Ce compte paiera des intérêts au taux de 0,14% par match.
      • Une réponse de "retrait" ajoutera, si le casse réussit, aux gains d'un joueur l'intégralité du contenu de son compte auprès de la banque cédée. Le compte sera alors mis à zéro. Notez que ces gains supplémentaires peuvent être volés par des double-crossers.
      • Une réponse de "double croix" fera deux choses:
        • Si le nombre d'historiens qui ont joué "double croix" est au plus de 1 / 10ème (arrondi vers le bas) du nombre total d'histoires non-racistes qui ont décidé de passer par le hold-up (ou exactement un s'il y a moins de 10 de ces joueurs) ), le joueur recevra des gains supplémentaires égaux au total des gains de tous les non-doubles-croisés divisé par le nombre de doubles-croisés (arrondi vers le bas). Tous les non-double-crossers dans ce cas reçoivent 0 crédit du casse. En d'autres termes, les double-crossers volent les crédits de tous les autres et le répartissent également entre eux.
        • Si le nombre d'historiens qui ont joué "double croix" dépasse le seuil, le joueur ne recevra aucun gain (si son casse a réussi), verra son chèque de paie divisé par deux et sera renvoyé de son travail. (Voir «changer d'emploi».) Dans ce cas, tous les non-double-crossers (y compris la populace) recevront un paiement de bonus du total des gains de tous les double-cross divisé par le nombre total de non-double-crossers. En d'autres termes, la conspiration est devenue trop grande pour garder un secret, les conspirateurs ont été extirpés et exclus du cambriolage, et tout le monde a divisé leurs enjeux pour la punition - et leur réputation de sales coups leur a également fait perdre leur emploi.
      • Une réponse de "doigt" (comme dans "doigter un rat scélérat à double croisement") donnera, si le braquage réussit, au joueur huit opportunités (tirant uniformément avec remplacement de l'ensemble des héritiers non racistes) d'identifier un double- croiseur qui n'a pas déjà été ainsi identifié .
        • Chaque double-croiseur identifié de cette façon paiera immédiatement le doigté 25% de ses avoirs de crédit actuels (arrondis vers le bas) au lieu d'être abattu, perdra son emploi et verra son chèque de paie réduit de moitié (car le patron ne tolérera pas les mauvais comportements) , et perd 5% de sa probabilité de victoire à la banque en train d'être cambriolé (car les autres héritiers sont très méfiants à l'avenir et susceptibles de le jeter sous le bus si les choses deviennent velues). Les doubles croisements identifiés de cette façon n'affectent pas la réussite du double croisement pour d'autres doubles, mais ils ne reçoivent aucun des crédits volés du double croisement, et lesdits crédits volés seront redistribués aux non traverseurs doubles.
        • Si aucun double-croiseur n'est identifié de cette façon, le vif d'or obtiendra des points de suture pour perdre le temps de tout le monde - et paiera également la moitié de ses gains du cambriolage actuel, réduira de 5% son salaire (le patron coupe les heures du tattletale) et perdra 5% de ses cotes de paris à la banque actuelle (car les autres héritiers sont moins susceptibles d'être généreux / justes avec leurs gains à l'avenir). La moitié de ses gains ainsi perdus sera distribuée aux double-crossers sans doigts si les double-crossers réussissent, ou aux non-double-crossers (y compris la racaille) si les double-crossers échouent.

Les banques

La banque est sélectionnée à l'aide de l'indice numheisters + int(totalamountbet/100000), où numheisters est le nombre de joueurs qui ont misé une mise positive au tour 1 et totalamountbet est la somme des mises de tous ces joueurs. En d'autres termes, cent mille crédits équivalent à un héritier supplémentaire. Sur la base de cet indice, l'une des banques suivantes sera choisie, la banque avec le seuil le plus élevé que l'indice atteint ou dépasse:

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

Notez qu'au fur et à mesure qu'un tournoi se poursuit, la probabilité d'atteindre le niveau de banque le plus élevé augmentera, car le montant que chaque joueur peut miser tend à augmenter. Notez également que ce ne sont que des cotes et des probabilités initiales , avant qu'elles aient été modifiées par des actions "acquérir des informations" ou "acheter un gardien". Avec les probabilités et les cotes initiales, seules la City et les banques nationales s'attendent à des gains supérieurs aux pertes attendues.

The Rabble

  • Le tournoi contient également 500 autres joueurs, appelés les "canailles", qui participent en tant que joueurs réguliers aux cambriolages mais ne sont pas marqués au final. Celles-ci servent à rendre chaque jeu différent et quelque peu moins prévisible, et permettent d'atteindre les banques les plus risquées / les plus rémunératrices même avec seulement quelques «vrais» joueurs.
  • Chaque jeu comprendra un sous-ensemble de racaille à participer choisi de manière uniforme au hasard sur tous les sous-ensembles de racaille.
  • Tous les canailles utilisent la stratégie suivante:
    • Choisissez au hasard de parier avec une probabilité égale à la probabilité de réussir à la banque qui serait sélectionnée en fonction des décisions des joueurs qui ont déjà pris leur décision ce tour .
    • Si vous misez un montant différent de zéro, choisissez le plus grand des montants suivants qui ne dépasserait pas ses avoirs actuels: 69, 420, 6969, 80085.
    • Au deuxième tour, "reculez" avec une probabilité égale à 5% plus 50% de la proportion de parieurs qui ont déjà fait marche arrière, sinon cédez comme d'habitude. (Notez que cela signifie que les premiers joueurs du deuxième tour qui reculent peuvent avoir d'énormes effets en cascade parmi la populace - faites attention et soyez prêt à ce que le braquage s'effondre avant même qu'il ne commence.)

Entrées et sorties

Dans les deux tours, les programmes recevront les informations suivantes, dans cet ordre exactement , comme arguments de ligne de commande . Sauf indication contraire, toutes les valeurs sont des entiers ne contenant aucune décimale.

  1. Le numéro de jeu actuel (indexé zéro)
  2. Le numéro du tour de la partie en cours (1 ou 2)
  3. Le nombre de joueurs dans le jeu en cours (y compris la racaille).
  4. Le nombre de joueurs qui ont déjà pris leur tour ce tour.
  5. Le nombre d'histoires qui ont jusqu'à présent engagé un enjeu positif. (Au deuxième tour, ce sera en fait le nombre total d'histoires qui ont adhéré au premier tour.)
  6. Le nombre total de crédits investis jusqu'à présent. (Dans le second tour, ce sera effectivement le nombre total de crédits investis au premier tour - en particulier, il ne comprend plus que les enjeux initiaux de « all in » heisters et ne comprend les enjeux de « reculer » héritiers.)
  7. Le nombre d'histoires qui ont confirmé au deuxième tour (c'est-à-dire qui n'ont pas "reculé"). Ce sera zéro lors du premier tour.
  8. Le numéro (indexé à zéro) de la banque à céder (au premier tour, la banque qui serait cédée si personne d'autre ne pari)
  9. Le nombre de crédits actuellement disponibles pour le joueur.
  10. Le nombre de crédits misés par le joueur au premier tour. (C'est toujours zéro au premier tour.)
  11. Le nombre de crédits que le joueur recevra sur son salaire à la fin de chaque partie.
  12. 1 si le joueur reçoit actuellement un chèque de paie, 0 si le joueur est au chômage
  13. Classement du joueur au classement (hors canaille) à la fin de la partie précédente, indexé 1. (Défini comme 1 + le nombre de joueurs avec strictement plus de crédits à ce moment-là. Par exemple, lors du premier match, tous les joueurs ont le rang 1.)
  14. Le nombre moyen de crédits détenus par tous les joueurs (sans compter la racaille) (représenté par un nombre décimal)
  15. L'écart absolu moyen dans le nombre de crédits détenus par tous les joueurs (sans compter la racaille) (représenté par un nombre décimal)
  16. Le nombre maximum de crédits détenus par n'importe quel joueur (c'est-à-dire le nombre de crédits détenus par un joueur de rang 1, sans compter la racaille)
  17. Le nombre de crédits que le joueur a stockés dans le compte de la banque 0
  18. Compte bancaire 1
  19. Compte bancaire 2
  20. Compte bancaire 3
  21. Compte bancaire 4
  22. Probabilité individuelle de victoire du joueur à la banque 0
  23. Probabilité de la banque 1
  24. Probabilité de la banque 2
  25. Probabilité de la banque 3
  26. Probabilité de la banque 4
  27. Les chances de paiement individuelles du joueur en cas de succès dans la banque 0
  28. Cotes de la banque 1
  29. Cotes de la banque 2
  30. Banque 3 cotes
  31. Banque 4 cotes

Au premier tour d'une partie, un programme de joueur doit imprimer pour afficher un entier compris entre 0 et le nombre total de crédits dans le compte de ce joueur. Tout montant de pari supérieur au solde créditeur disponible est considéré comme un pari maximum. Toute autre sortie (ou condition d'erreur) sera interprétée comme un pari zéro.

Au deuxième tour d'un jeu, un programme de joueur doit imprimer pour stdout une chaîne comme décrit dans la section "Le deuxième tour de paris" ci-dessus. Une condition d'erreur ici est considérée comme l'action par défaut: poursuivre le braquage comme d'habitude.

Manette

Le tournoi se déroulera à l'aide de ce contrôleur . Des exemples de robots là aussi. Toujours en cours de test. Plus de code à venir. N'hésitez pas à soumettre des corrections de bugs (sur github). Sera mis à jour si des règles changent également.

Pour organiser un seul tournoi sur votre propre machine, ajoutez une ligne à competers.txt puis utilisez:

python bankheist.py 1000

Règlement du concours

  • Les joueurs peuvent soumettre n'importe quel nombre de programmes de joueur dans n'importe quelle langue librement disponible dont les programmes peuvent recevoir des arguments de ligne de commande.
  • Les soumissions doivent inclure des instructions assez explicites sur la façon de compiler des programmes et de les exécuter sur mon PC, y compris les noms des outils nécessaires et les commandes exactes à émettre. La soumission doit inclure au moins une commande qui exécute le programme et peut avoir des arguments de ligne de commande qui lui sont directement ajoutés.
  • Les soumissions doivent également avoir un nom unique pour les identifier (qui ne contient aucun espace).
  • Les programmes doivent s'exécuter dans un délai raisonnablement court. (Je ne fixe pas de limite supérieure à ce qui constitue raisonnable. Au lieu de cela, je conseillerai simplement le créateur toute entrée qui semble avoir un temps d'exécution hors normes pour l'accélérer.)
  • Les programmes peuvent ne pas lire ou écrire dans les fichiers. Ils ne peuvent pas non plus utiliser une autre méthode de stockage des informations entre les exécutions. Le but de ce défi est de prendre des décisions complexes sur la base d'informations limitées / résumées.
  • Toutes ces règles peuvent être modifiées à tout moment si nécessaire. Un message sera ajouté en haut de ce message indiquant de telles modifications.
  • Ce concours se termine au plus tôt une semaine après que le dernier utilisateur a soumis sa première soumission . Les modifications des soumissions existantes sont autorisées à tout moment jusqu'à la fin du concours. Je ferai de mon mieux pour maintenir la date limite actuelle à jour dans un message en haut de cet article.
  • Ce concours se termine au plus tôt une semaine après la dernière modification des règles, le cas échéant. Je ferai de mon mieux pour laisser des commentaires aux utilisateurs concernés par les modifications de règles.
  • Vous feriez mieux de parier que je participerai moi-même à ce concours. ;)
quintopie
la source
Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
Dennis
Peut-être parce que je ne suis pas familier avec le twitch ou le jeu de braquage, mais il y a beaucoup de règles qui peuvent être mieux démontrées avec un petit exemple. Pour le moment, cela ne semble pas très accessible.
Moogie
Roi de la colline? Je n'ai pas entendu ce nom depuis des années.
Beta Decay

Réponses:

6

Quelques "mauvais" exemples de programmes.

Ce sont des robots que j'ai écrits pour tester le contrôleur. Généralement, ils font juste le minimum nécessaire pour tester un type d'action spécifique. Selon le niveau de participation à ce KotH, de quelques-uns à tous seront inclus dans le tournoi final, car une grande partie de la stratégie du jeu proviendra du traitement des comportements de nombreux bots différents.

Je les inclue tous ici principalement comme exemples "d'utilisation".

Lurker

Ne pariez jamais. Si vous ne battez pas cela, repensez votre stratégie.

print 0

PassivePanga

Toujours miser 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

Faites un pari Kelly si et seulement si le critère Kelly est respecté. Comme cela se produit rarement en faisant d'abord "acquérir des informations" et "acheter la garde", cela donne généralement le même résultat que 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

Faire un pari Kelly si et seulement si le nombre de heisters vus jusqu'à présent indiquent que le pari sera satisfait au critère Kelly (mais ne recule pas si mal). Fait généralement pire que 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

Allez "all in" sauf si vous gagnez déjà.

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

Misez toujours une petite fraction constante des avoirs.

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

Changer beaucoup d'emplois en début de tournoi. Dépensez tout cet argent pour améliorer les probabilités et les chances. Ensuite, passez les derniers matchs à tapis. Cela ferait probablement beaucoup mieux sans faire tapis à moins d'être déjà en tête.

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

Change d'emploi autant que possible pour la majeure partie du tournoi. Évite de parier plus que le minimum nécessaire. Fait assez bien, mais pas génial.

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

Changez d'emploi autant que possible pendant la première partie du tournoi. Passez tous les autres matchs en double traversée. Fait décemment bien même contre SnitcherKing. Sera probablement plus mal une fois que de nombreux autres bots se croiseront et se doigteront. Sinon, les règles devront peut-être être modifiées.

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

Misez toujours le minimum et toujours le doigt. Fait assez bien dans les petits tournois qui incluent LimeadeSneaktar.

import sys

round = int(sys.argv[2])

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

RaysFive01K

Un peu plus compliqué - et donc plutôt bon. La plupart de ses avantages proviennent du dépôt de tous les gains en début de tournoi (en les protégeant des doubles crossers) tout en augmentant ses probabilités de victoire (et en changeant de travail pour payer tous ces gardes et cambriolages), puis en les retirant tous à la fin de la partie ( une fois qu'ils ont gagné un intérêt sérieux et que la probabilité de ne pas se retirer est suffisamment faible - bien qu'ici les pertes sur les doubles croiseurs constituent un risque sérieux). Ce sera certainement dans le tournoi, et peut ou non être un concurrent sérieux.

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"
quintopie
la source
J'approuve ces noms <insérer les mèmes Twitch et Panga>
CAD97
2

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

Il soudoie les gardes jusqu'à ce qu'il ait la probabilité de gagner, puis fait tapis. Seul.

Change d'emploi quand il a besoin de plus d'argent pour soudoyer des gardes.

MegaTom
la source
comment s'appelle ce joueur?
quintopie
@quintopia ops! J'ai oublié que j'ai réussi à le poster! Nom et explication ajoutés.
MegaTom
Agréable. Juste comme conseil, vous n'avez pas besoin de faire toutes ces typographies. Tout est déjà du bon type pour être évalué dès le départ. Ce qui signifie que la condition hired == "1"sera toujours fausse et qu'elle ne changera jamais de travail.
quintopie
Je l'ai juste couru en un seul tour contre tous les autres que j'ai faits. Entré à la dernière place.
Pas de