キングオブザヒル:バンクヘイスト


15

サンプル実行4/11を追加

ルールの明確化4/8:すべての提出物は、私のコンピューターが48時間で実行できる限り多くの試合で構成される1つの巨大なすべて無料のトーナメントで競います。

Twitchでストリームを視聴している人はだれでも、DeepBotの流行に気付いており、おそらくBank Heistのベッティングゲームにも精通しています。このキングオブザヒルトーナメントは、そのゲームから直接インスピレーションを得ています。でも心配しないで。私は、物事を面白く保つために、このバージョンに十分な追加のねじれを投入したと思います。

簡単な例

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

ゲームのルール

トーナメント/ゲーム構造

  • トーナメントは、1000〜1100の間でランダムに選択された多数のゲームで構成され、すべての深刻な提出物がすべて無料で同時に競います。
  • すべてのプレーヤーは240 クレジットで最初のゲームを開始し、後続の各ゲームは前のゲームの終了時に持っていたクレジット数で開始します。
  • 各ゲームは2ラウンドで進行し、各ラウンドでは、プレイヤーはランダムに一律に決定された順序で呼び出され、1つの決定を下します。
    • 最初のラウンドでは、プレーヤーは、銀行強盗への参加を賭けるために、0から現在のクレジット保有までの任意の整数のクレジットを支払うことができます。
    • 第2ラウンドでは、少なくとも1クレジットを賭けて強盗に参加することを選択した各プレイヤー(以下「ヘイスター」と呼びます)は、その賭けに乗ることを決定することができます(そうする間に、他のアクションを実行する可能性があります)。強盗からオプトアウトするか、オールインします。(これらのオプションについては、以下でさらに説明します。)
  • 強盗の数と彼らが支払ったクレジットの総数に基づいて、強盗を上演する5つの銀行の1つが選択されます。この選択は、個々の勝利の確率と配当が決定されるオッズに影響します。(銀行については以下で説明します。)
  • オプトアウトしなかった各ハイスターは、銀行の(修正された)確率で、その賭け金に銀行の(修正された)賭けオッズ(端数切り捨て)を掛けたものを勝ち取るか、または賭け金を失います。各プレイヤーの成功または失敗は個別に決定されることに注意してください。他のプレイヤーが失敗した場合に成功するプレイヤーもいます。
  • 参加したかどうかにかかわらず、すべてのプレーヤーは成功したか失敗したかを確認し、給料を受け取ります(下記の例外を除く)。
  • ゲームを完全に終了することは不可能であることに注意してください。最悪の場合、プレイヤーはゲームを待って次の給料を受け取る必要があります。
  • すべての1000-1100ゲームの後、最も多くのクレジットを持つプレイヤーがそのトーナメントの勝者として宣言されます。
  • トーナメントは不特定の回数(48時間以内に計算できる回数)繰り返され、すべてのトーナメントのプレイヤーの収益が合計されて、このコンテストの全体的な勝者が決定されます。

第2回ベッティングラウンド

  • 最初のラウンドで積極的な賭けをしたプレーヤーは、2番目のラウンドに参加できます。
  • このラウンドでは、プレーヤーは次のことができます。
    • ベットをキャンセルするには、「back out」という文字列で返信します。これにより、現在の強盗の賭け金がゼロに設定され、強盗に残っているプレイヤーが成功する確率がわずかに低下します。このオプションを採用することにより、プレイヤーは、残りのハイスターを危険にさらすための罰として、強盗に続く240クレジットの給料を差し控えます。(残りのハイスターは、銀行の確率に「バックアウト」しなかったハイスターの割合を掛けた確率で成功します。)
    • 「オールイン」という文字列で返事をして、クレジット保有全体を吹き飛ばし、次の240クレジットペイチェックで給料日ローンを取ります-強盗のために最高のギアとインテルをすべて購入し、単独で入ります誰にでも依存しています。このようなプレーヤーの勝利確率は、強盗から脱落した他のハイスターの影響を受けず、その勝利はダブルクロッサーによって盗まれることもありません。勝ちの配当は、その賭けがクレジット保有全体に240を加えたものであるかのように決定され、損失はその保有をゼロに設定します。
    • 前の賭けに固執し、通常通り強盗で通り抜けるために、他の文字列(空の文字列を含む)で返信します。(推奨返信:「!guncheck」)。特定の返信には、追加の副作用があります。
      • 「ジョブを変更する」と応答すると、プレーヤーはジョブを終了します。このラウンドを開始すると、各ラウンドの終わりに、プレーヤーは5%のチャンスで新しいポジションに雇用されます。これが成功すると、プレーヤーは雇われ、すぐに最初の給料を受け取ります。新しいジョブはそれぞれ、最後のジョブよりも正確に5%高い金額(端数切り捨て)を支払うことが保証されています。このアクションは、強盗が成功したかどうかにかかわらず成功します。
      • 「inquire」の応答は、強盗が成功した場合、プレイヤーがその強盗からのすべての賞金を費やしてクレジットごとに余分な0.00001を得るため、そのプレイヤーだけのために強盗さた銀行のオッズに費やされます。このオッズ変更は永続的です。例として、プレイヤーが銀行1を強盗するときにこのアクションを選択し、強盗で6969クレジットを獲得した場合、そのプレイヤーの銀行1のオッズは恒久的に0.06969増加し、プレイヤーは強盗から何も受け取りません。
      • 「警備員を購入する」という返事は、プレイヤーが強要されている銀行の警備員の一人を買い取る原因となります。そのプレイヤーの給料(ガードの通常の賄bri)の1クレジットの永久的な引き下げと引き換えに、プレイヤーは(そのプレイヤーが警官に「言及するのを忘れる」ためにその銀行で「永続的な」増加した勝利確率を受け取ります質問)。確率は、その銀行でのプレイヤーの現在の勝利確率と100%の差のちょうど1%増加します。このアクションは、強盗が失敗しても成功します。注:いつでも、プレイヤーがすべてのガード賄briを支払うのに十分なクレジットを持っていない場合、即座に「永久に」支払うことができなかった賄briの数と同じ数の確率ボーナスを失います。
      • 「デポジット」の返信は、強盗が成功した場合、強盗された銀行の口座にプレイヤーの全賞金を残します。クレジットはいかなる目的でもアクセスできず、撤回されるまでプレイヤーのスコアにカウントされません。このアカウントは、ゲームごとに0.14%の利率で支払います。
      • 「撤回」の返信は、強盗が成功した場合、強盗された銀行の口座の内容全体をプレーヤーの賞金に追加します。その結果、アカウントはゼロになります。これらの追加の賞金、ダブルクロッサーによって盗まれる可能性があることに注意してください。
      • 「ダブルクロス」の返信は、次の2つのいずれかを実行します。
        • 「ダブルクロス」をプレイしたヘイスターの数が、強盗と一緒に進むことを決定した非ラブルヘイスターの総数の10分の1(切り捨て)である場合(または、そのようなプレイヤーが10人未満の場合は正確に1人) )、プレーヤーは、すべての非ダブルクロッサーの合計賞金をダブルクロッサーの数で割った(切り捨て)に等しい追加の賞金を受け取ります。この場合のすべての非二重交差者は、強盗から0クレジットを受け取ります。言い換えれば、ダブルクロッシングは他のすべてのクレジットを盗み、それを均等に分けます。
        • 「ダブルクロス」をプレイしたハイスターの数がしきい値を超えた場合、プレーヤーは(その強盗が成功した場合)賞金を受け取らず、給与を半分に削減し、仕事から解雇されます。(「ジョブの変更」を参照してください。)この場合のすべての非ダブルクロッサー(ラブルを含む)は、すべてのダブルクロッサーの合計賞金を非ダブルクロッサーの総数で割ったボーナスを受け取ります。言い換えれば、陰謀が大きすぎて秘密を守ることができず、陰謀者は根こそぎにされて強盗から排除され、誰もが罰のために賭け金を分けました。
      • 「finger」(「二重交差悪党ネズミの運指」のような)の返信は、強盗が成功した場合、プレイヤーに8つの機会を与えます(非ラブルハイスターのセットから交換して均一に描画します)。まだまだ特定されていないクロッサー。
        • この方法で特定された各二重交差者は、撃たれる代わりに現在の保有クレジットの25%(切り捨て)をすぐに支払い、職を失い、給与を半分に削減します(上司は悪い行動を容認しないため) 、強盗されている銀行での勝利の確率の5%を失います(将来、他の強盗は非常に疑わしく、物事が毛むくじゃらになるとバスの下に投げる可能性が高いため)。この方法で特定されたダブルクロッサーは、他のダブルクロッサーのダブルクロスが成功したかどうかには影響しませんが、ダブルクロスから盗まれたクレジットを受け取ることはなく、盗まれたクレジットは再分配され、ダブルクロッサー。
        • この方法でダブルクロッシングが特定されない場合、スニッチは全員の時間を無駄にするためにステッチを取得します。また、現在の強盗からの賞金の半分を支払い、その給料を5%カットします(ボスはタトルテールの時間をカットします)、そして失う現在の銀行でのベッティングオッズの5%(他のハイスターは将来の賞金に寛大/公平になる可能性が低いため)。このようにして失われた勝ちの半分は、ダブルクロッサーが成功した場合は指のないダブルクロッサーに、ダブルクロッサーが失敗した場合は非ダブルクロッサー(ラブルを含む)に分配されます。

銀行

銀行はインデックスを使用して選択されますnumheisters + int(totalamountbet/100000)。numheistersはラウンド1で正の賭け金を賭けたプレーヤーの数で、totalamountbetはそれらすべてのプレーヤーの賭け金の合計です。言い換えれば、10万クレジットは追加のハイスター1つと同等です。このインデックスに基づいて、次の銀行の1つが選択されます。この銀行は、インデックスが満たすか、または超える最大のしきい値を持つ銀行です。

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

トーナメントが継続するにつれて、各プレイヤーがベットできる金額が上昇傾向になるため、最高の銀行レベルに達する可能性が高くなることに注意してください。また、これらは「acquire intel」または「buy a guard」アクションによって変更される前の初期のオッズと確率にすぎないことに注意してください。最初の確率とオッズでは、市と国立銀行だけが予想損失を上回る勝利を予想しています。

ラッブル

  • トーナメントには、「ラブル」と呼ばれる500人の他のプレーヤーも含まれています。これらのプレーヤーは、強盗に通常のプレーヤーとして参加しますが、最終的に得点されません。これらは、各ゲームを異なるものにし、多少予測しにくくし、少数の「本物の」プレーヤーでも、よりリスクの高い/より価値のある銀行に到達することを可能にします。
  • 各ゲームには、すべてのサブセットをランダムに選択して参加するための一部のサブセットが含まれます。
  • すべての競合は次の戦略を使用します。
    • このラウンドですでに決定を下したプレイヤーの決定に基づいて選択される銀行で成功する確率に等しい確率で、ランダムに賭けることを選択します。
    • ゼロ以外の金額をベットする場合、現在の保有額を超えない範囲で最大の金額を選択してください:69、420、6969、80085。
    • 2回目のラウンドでは、5%にすでにバックアウトしたベッターの割合の50%に等しい確率で「バックアウト」します。(これは、第2ラウンドの初期のプレイヤーが撤退することで、瓦の中で大きなカスケード効果が得られることを意味することに注意してください。注意を払い、強盗が始まる前に崩壊する準備を整えてください。)

入力と出力

どちらのラウンドでも、プログラムにはコマンドライン引数として正確にこの順序で次の情報が与えられます。特に明記しない限り、すべての値は小数を含まない整数です。

  1. 現在のゲーム番号(ゼロインデックス)
  2. 現在のゲームのラウンド数(1または2)
  3. 現在のゲームのプレイヤーの数(がれきを含む)。
  4. このラウンドですでにターンを取っているプレーヤーの数。
  5. これまでに肯定的な利害関係を持っているハイスターの数。(2回目のラウンドでは、これは実際には1回目のラウンドでバイインしたハイスターの総数になります。)
  6. これまでに投資したクレジットの総数。(第2ラウンドでは、これは実際には第1ラウンドで投資されたクレジットの合計数になります。特に、「オールイン」ハイスターの初期ステークス以上含まれ、「バックアウト」のステークス含まれます。ヘイスター。)
  7. 2回目のラウンドで確認した(つまり「バックアウト」しなかった)ヘイスターの数。これは最初のラウンドではゼロになります。
  8. 強要される銀行の(ゼロから始まる)番号(最初のラウンドでは、誰も賭けなかった場合に強盗される銀行)
  9. プレーヤーが現在利用できるクレジットの数。
  10. プレーヤーが最初のラウンドでベットしたクレジットの数。(これは最初のラウンドでは常にゼロです。)
  11. プレイヤーが各ゲームの終了時に給料で受け取るクレジットの数。
  12. プレーヤーが現在給料を受け取っている場合は1、失業者の場合は0
  13. 前のゲームの終了時点でのリーダーボードでのプレイヤーのランク(瓦を含まない)、1インデックス。(1+その時点でより多くのクレジットを厳密に持っているプレイヤーの数として定義されます。例えば、最初のゲームの間に、すべてのプレイヤーはランク1を持ちます。)
  14. すべてのプレーヤーが保持しているクレジットの平均数(瓦を除く)(10進数で表されます)
  15. すべてのプレイヤーが保持しているクレジット数の平均絶対偏差(瓦includingを除く)(10進数で表示)
  16. 任意のプレーヤーが保持するクレジットの最大数(つまり、ランク1プレーヤーが保持するクレジットの数(瓦を含まない))
  17. プレイヤーが銀行0口座に保存したクレジットの数
  18. 銀行1口座
  19. 銀行2口座
  20. 銀行3口座
  21. 銀行4口座
  22. バンク0でのプレイヤーの勝利の個々の確率
  23. 銀行1の確率
  24. 銀行2の確率
  25. 銀行3の確率
  26. 銀行4の確率
  27. 銀行0での成功した強盗に対するプレイヤーの個々の支払いオッズ
  28. バンク1オッズ
  29. バンク2オッズ
  30. 銀行3オッズ
  31. バンク4オッズ

ゲームの最初のラウンドでは、プレーヤープログラムは0からそのプレーヤーのアカウントのクレジット総数までの整数を標準出力に出力する必要があります。利用可能なクレジット残高を超えるベット額は最大ベットとみなされます。その他の出力(またはエラー状態)は、ゼロベットとして解釈されます。

ゲームの第2ラウンドでは、上記の「第2ベットラウンド」のセクションで説明したように、プレーヤープログラムは文字列を標準出力する必要があります。ここでのエラー状態は、デフォルトのアクションであると見なされます。通常通り、強盗で処理します。

コントローラ

トーナメントはこのコントローラーを使用し実行されます。ボットの例もあります。まだテスト中です。さらなるコード。(githubで)バグ修正を送信してください。ルールも変更されると更新されます。

自分のマシンで単一のトーナメントを実行するには、competitors.txtに行を追加してから使用します:

python bankheist.py 1000

コンテストのルール

  • プレーヤーは、プログラムがコマンドライン引数を受け取る可能性のある自由に利用可能な言語で、プレーヤープログラムをいくつでも提出できます。
  • 提出には、必要なツールの名前や発行する正確なコマンドなど、プログラムをコンパイルしてPCで実行する方法に関するかなり明確な指示を含める必要があります。提出には、プログラムを実行するコマンドを少なくとも1つ含める必要があり、コマンドライン引数を直接追加することができます。
  • 提出物には、それらを識別するための一意の名前(スペースを含まない)も必要です。
  • プログラムはかなり短い時間で実行する必要があります。(私は合理的なものに上限を設定していません。むしろ、スピードアップのために実行時間に余裕があると思われるエントリを作成者に単にアドバイスします。)
  • プログラムはファイルを読み書きできません。また、実行間で情報を保存する他の方法を使用することもできません。この課題のポイントは、限られた/要約された情報に基づいて複雑な決定を下すことです。
  • これらの規則はすべて、必要に応じていつでも変更される可能性があります。そのような変更を示すメッセージがこの投稿の上部に追加されます。
  • このコンテストは、最後のユーザー最初の投稿を投稿してから1週間以内に終了します。既存の提出物の変更は、コンテストが終了するまでいつでも許可されます。この投稿の上部にあるメッセージで、現在の締め切りが更新されるように最善を尽くします。
  • このコンテストは、ルールが変更された場合、最後にルールが変更されてから1週間以内に終了します。ルールの変更の影響を受けるユーザーにコメントを残すように最善を尽くします。
  • 私はこのコンテストに自分で参加することになります。;)

コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
デニス

たぶん私はけいれんや強盗ゲームに精通していないが、小さな実例で最もよく示されるかもしれない多くの規則があるからです。現時点では、あまり親しみやすいものではないようです。
ムージー

キングオブザヒル?私は何年もその名前を聞いていません。
ベータ崩壊

回答:


6

プログラムのいくつかの「悪い」例。

これらは、コントローラーをテストするために作成したボットです。ほとんどの場合、特定のタイプのアクションをテストするために最低限必要なことを行うだけです。このKotHへの参加レベルに応じて、ゲーム内の多くの戦略が多くの異なるボットの動作に対処することになるため、これらの数個からすべてが最終トーナメントに含まれます。

ここでは、それらのすべてを主に「使用」の例として含めます。

ラーカー

決して賭けない。これを破っていない場合は、戦略を再考してください。

print 0

パッシブパンガ

常に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

ケリー基準が満たされている場合にのみ、ケリーベットを行います。これは、最初に「acquire intel」および「buy guard」を実行することではめったに起こらないため、通常は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

これまでに見られたハイスターの数がベットケリー基準満たしていることを示す場合にのみ、ケリーのベットを行います(ただし、間違っている場合は取り消さないでください)。通常、ラーカーよりも悪い

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"

モニの中毒

すでに勝利していない限り、「オールイン」に進みます。

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

常に小さな一定割合の持ち株に賭けます。

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

初期のトーナメントで仕事を大きく変えてください。お金を使って確率とオッズを改善します。その後、最後のいくつかのゲームをオールインします。すでにトップスポットにいる場合を除き、オールインしなくても、これはおそらくはるかに良い結果をもたらすでしょう。

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

トーナメントのほとんどで可能な限りジョブを変更します。必要以上の賭けを避けます。まともですが、素晴らしいではありません。

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

トーナメントの最初の部分で可能な限りジョブを変更します。他のすべてのゲームのダブルクロスをお過ごしください。SnitcherKingに対してさえもうまく機能します。他の多くのボットが二重に交差して運指をかけると、おそらくもっとうまくいかないでしょう。そうでない場合-ルールを変更する必要がある場合があります。

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"

スニッチャーキング

常に最小額を賭け、常に指で。LimeadeSneaktarを含む小さなトーナメントでかなりうまくいきます。

import sys

round = int(sys.argv[2])

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

RaysFive01K

もう少し複雑です。したがって、実際にはかなり良いです。その利点のほとんどは、初期のトーナメントですべての賞金を預け入れ(ダブルクロスから保護)、勝利確率を高め(そして、すべてのそれらのガードと強盗に支払うために仕事を変え)、ゲームの最後にそれらをすべて撤回することです(彼らが深刻な関心を獲得し、撤回に失敗する可能性が十分に低いとはいえ、ここでは二重交差者への損失は深刻なリスクです)。これは間違いなくトーナメントに出場するものであり、深刻な競争相手になる場合もあれば、そうでない場合もあります。

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"

私は<単収縮&Pangaミーム挿入>これらnameingsを承認
CAD97

2

ローン・ジョン

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"

賄besは、勝つ可能性があるまで警備し、それからすべてが入ります。

警備員に賄toを贈るのにもっとお金が必要になったら仕事を変える。


このプレーヤーは何と呼ばれていますか?
キントピア

@quintopia ops!私はそれを投稿するすべての方法を得たことを忘れていました!名前と説明が追加されました。
メガトム

いいね ヒントとして、これらすべての型キャストを行う必要はありません。すぐに評価されるので、すべてがすでに正しいタイプです。つまり、条件hired == "1"は常にfalseになり、ジョブが変更されることはありません。
キントピア

私は自分が作った他のすべてに対して、1回のラウンドでそれを実行しました。最後の場所に来ました。運が悪い:(
quintopia
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.