7月のクリスマスです。だから、仮想の白い象のギフト交換よりも良いお祝いの方法です。
このキングオブザヒルチャレンジでは、ホワイトエレファントエクスチェンジシミュレーションで遊ぶボットを作成し、可能な限り最高のプレゼントを獲得する必要があります。
ゲームのルール
- ゲームは多くのラウンドでプレイされ、各ラウンドは可変数のターンで構成されます。
- ラウンド設定:ゲーム内のプレイヤーと同じ数のプレゼントがあり、それぞれが範囲[0 ... 1)でランダムに均一に評価されます。この値は、プレゼントが「開かれる」まで不明です。プレイヤーはランダムな順番でキューに入れられます。最初のプレーヤーがキューの先頭からポップされます。
- プレイヤーのターンのとき、彼らはプレゼントを開くか、他のプレイヤーのプレゼントを盗んで、プレゼントが盗まれたプレイヤーにターンを渡すことができます。
- 各プレゼントは最大3回盗まれます。
- 盗まれたプレイヤーから盗むことはできません。
- 各プレーヤーは、一度に1つのプレゼンスしか持てません。
- プレゼントが開かれた後、プレイはキューの先頭からポップされた次のプレイヤーに進みます。これは、まだ順番が来ていない次の順番のプレイヤーになります。
- ラウンド終了:すべてのプレゼントが開かれると、ラウンドが終了し、各プレイヤーが保持しているプレゼントの値がそのプレイヤーのスコアに加算されます。新しいラウンドが始まり、各プレイヤーは現在何も持っておらず、プレイヤーの順番はシャッフルされます。
- ゲームの終了:少なくとも1人のプレイヤーが
100500ポイントを獲得すると、ゲームは終了し、プレゼントの合計値が最も高いプレイヤーに勝利が与えられます。
コーディング
すべての提出物はPython 3.7と互換性がある必要があります。から直接継承するクラスを作成する必要がありますWhiteElephantBot
。例えば:
class FooBot(WhiteElephantBot):
# Your implementation here
ボットクラスで__init__
メソッド(引数を1つ取るname
)を提供できます。このメソッドはを呼び出す必要がありますsuper().__init__(name)
。クラスにはtake_turn
、この順序で次の引数を受け取るメソッドが必要です。
players
:まだプレゼントを持っていないすべてのプレイヤーの順番でのプレイヤー名のリスト。presents
:プレーヤー名を2タプルにマップする辞書。このタプルには、そのプレーヤーが保持している現在の値と、現在の盗まれた回数が含まれています。これには、現在プレゼントを持っている他のプレイヤーのみが含まれます。just_stole
:最後に行われたアクションがスチールであった場合、これは盗んだプレーヤーの名前になります。そうでない場合は、になりますNone
。
各引数は不変または新しいオブジェクトであるため、それらのいずれかを変更してもゲームに影響はありません。必要に応じて、任意の引数のコピーを保持できます。
以下の値の例presents
:
{
'Alice': (0.35, 0),
'Bob': (0.81, 2),
'Charlie': (0.57, 1)
}
あなたのtake_turn
方法はあなたから盗むしたり、希望するプレイヤーの名前を返す必要がありますNone
存在を開くことを。例外を発生させstr
たりNone
、または以外の何かを返したり、盗むことができないプレーヤーの名前を返したりした場合、デフォルトでプレゼントを開きます。
コンストラクタは各ラウンドの開始時に呼び出されるため、ラウンドごとに状態を覚えることはできません。
から継承することにより、WhiteElephantBot
現在のsteal_targets
辞書を取得し、just_stole
盗むことができるプレイヤーの名前のリストを返すメソッドにアクセスできます。
スクリプトに必要なモジュールは、エントリの一番上にインポートする必要があります。
テストドライバー
テストドライバーはこちらにあります。from white_elephant import WhiteElephantBot
投稿された回答に含める必要はありませんが、ローカルモジュールで行う必要があります。
ベースラインの競合他社
- ランダム:新しいプレゼントを開くか、スチールするかをランダムに選択します。スチールターゲットは一様にランダムに選択されます。
- 貪欲:盗まれ得る最も価値のあるプレゼントを盗みます。プレゼントを盗まれない場合は、プレゼントを開きます。
- Nice:常に新しいプレゼントを開きます。盗むな。
追加の規則
- すべての例外をキャッチするのはあなたの責任です。クラスが例外のキャッチに失敗した場合、失格になります。また、KeyboardInterruptsをキャッチしないでください。
- ファイルや他の方法を使用して、ゲーム間で状態を保存できないことを回避しないでください。たとえば、途中でニューラルネットワークの状態をファイルに保存することはできません。
- ボットは、クラスコードおよび関連する定数内に自己完結している必要があります。
- 標準ライブラリのインポートのみを使用できます。
- 厳密なパフォーマンス要件はありません。合理的かつ慎重になります。パフォーマンスが問題になる場合、時間制限を追加する権利を留保します。
1人につき1つのエントリ。複数のエントリを送信すると、ボットが連携して動作しない場合があります。現時点では、1人につき複数のエントリを許可しますが、問題が生じた場合は後で禁止する場合があります。- これは明確な終了日がないオープンな競争です。大幅な変更があった場合は、いつでも再実行できます。
EDIT1:ランキングがより一貫するように、勝利スコアを100から500に変更しました。テストドライバーには新しいバグ修正があり、勝利スコアの変更も反映されます。
EDIT2:必要なインポートに関するメモを明確化。
リーダーボード(2018年8月8日現在)
- SampleBot(500.093)
- LastMinuteBot(486.163)
- ロビンフッド(463.160)
- オッドトッド(448.825)
- GreedyBot(438.520)
- SecondPlaceBot(430.598)
- ThresholdBot(390.480)
- ギャンブラー(313.362)
- NiceBot(275.536)
- RandomBot(256.172)
- グッドサマリタン(136.298)