あなたの目標は、Wythoff's Nimのゲームに最適なプレイヤーを書くことです。
ワイソフのニムのルール
WythoffのNimは、2つの同じカウンターの山でプレイされる決定論的な2プレイヤーゲームです。プレイヤーは交互にターンし、次のいずれかを行います。
- 最初のパイルから1つ以上のカウンターを削除します
- 2番目のパイルから1つ以上のカウンターを削除します
- 最初のパイルと2番目のパイルの両方から、等しい数のカウンター(1つ以上)を削除します。
もちろん、パイルは負になることはできませんが、0にすることはできます。最後のカウンターをすべて削除したプレイヤーがゲームに勝ちます。
より幾何学的に考えるために、このアプレットでプレイできるゲームの同等の定式化を以下に示します。単一の女王は、コーナーが左下にある4分の1の無限チェス盤の正方形から始まります。プレイヤーは交互にクイーンを移動します。クイーンはチェスのクイーンのように移動しますが、3方向に制限されます。
- ダウン
- 左
- 斜め下および左
クイーンをコーナーに移動する人が勝ちます。
クイーンの座標(コーナー(0,0)
)をそれぞれのパイルのサイズに関連付けると、両方のゲームが同じであることが簡単にわかります。
完璧なプレイ
(完璧なプレーと勝利の動きの概念に精通している場合は、これをスキップできます。)
WythoffのNimは有限で決定的なゲームであるため、完全なプレイという概念があります。完璧なプレーヤーとは、常に理論的に勝ったポジションから勝つ戦略です。つまり、勝利を保証する戦略が存在するポジションです。
勝利戦略となるには、移動したばかりのプレーヤーの理論上の勝利位置に常に移動するように移動するだけで十分です。これらの最初の勝利ポジション(コールドポジションとも呼ばれ(0,0), (1,2), (2,1), (3,5), (5,3)
ます)はです。Wythoff's Nimの勝利戦略を見つけるアルゴリズムの説明と、勝利ポジションを生成する公式については、Wikipediaの記事を参照してください。
プログラム要件
プログラムや関数を書くと、入力として位置を取り、その動きの後の位置の形で勝ちの動きを出力します。最少バイトが勝ちます。
勝ち手が存在しない場合、つまりポジションが理論上の損失である場合、プログラムはその旨を示し、没収する必要があります。
プログラムは妥当な時間内に実行する必要があります。したがって、指数関数的再帰ゲームツリー検索では十分ではありません。戦略を事前に計算してハードコーディングしたい場合は、問題ありません。
入力
(i,j)
杭のサイズを表す、それぞれ最大で1組の負でない数99
。これは、2つの数字、タプル、リスト、または任意のコンテナにすることができます。
出力
移動後の位置を、再び2つの数字またはそのコンテナーとして印刷または出力します。これは勝ちのポジションへの合法的な動きでなければなりません。このような動きが複数ある場合、どれでも構いませんが、1つだけです。
勝つ動きがない場合は、出力でこれを示す必要があります。任意の出力は次のようにFalse
、None
0、または(-1,-1)
それは法的な位置ではありません、すべて負け入力のための同じである限り、行います。
実行例
f(5,0) = (0,0)
f(2,2) = (1,2) # Or (2,1) or (0,0)
f(1,2) = False
f(13,9) = (13,8) # Or (10,6)
f(10,6) = False
f(5,10) = (5,3)
f(25,30) = (8,13)