戦争ゲームの結果を見つける
私が小学校にいたとき、「ロック紙はさみ」のようなゲームがありました。集会中、先生を待つとき、休憩時間などにプレイしました。「戦争」と呼びました。いくつかの検索の後、これは「ショットガンゲーム」(WikiHowによる)のはるかに単純なバリアントであることがわかりました。ルールがわずかに異なるため、これを「戦争」と呼びます。
2人が向かい合って座っています。ゲームの目的は、他のプレイヤーを「殺す」ことです。ターンごとに、次の3つの動きのいずれかをプレイできます。
リロード:あなたは一発の銃を持っています。毎回起動する前にリロードする必要があります。すでに弾薬を持っている場合のリロードは合法ですが、何もしません。リロードは、両手でこめかみをタップすることで象徴されました。各プレイヤーは弾薬0から始まります。
ガード:唯一の安全な動き。警備中に撃たれても、死なない。ガードは、胸に腕を組むことで象徴されました。
発射:銃を発射します。発射に成功するには、最後のショットからリロードする必要があります。相手がリロードしている場合、あなたが勝ちます。彼らも発砲し、あなたの両方が弾薬を持っている場合、それは引き分けです。彼らが警備している場合、弾薬を無駄にします。弾薬なしでの発砲は合法的な動きですが、何もせず、リロードのような脆弱性を残します。発射は、他のプレイヤーを指すことで象徴されました。
RPSと同様にプレイされました。各プレイヤーが同時に選択をスローダウンしました(互いのリズムを保つために、ターンの間に足を2回タップしましたが、それはチャレンジにとって重要ではありません)。
チャレンジ:
あなたの仕事は、戦争ゲームの結果を見つけることです。関数または完全なプログラムを指定できます。
入力
各プレイヤーが各ターンで選択したオプションは、文字/文字列で表されます:
r:リロード
g:ガード
f:火
入力は、ペアのリスト、区切られた/区切られていない文字列、またはこれらの行に沿ったその他のものです。
Pythonの入力例として、があります[("r", "g"), ("f", "r")]
。これは、最初のターンで最初のプレイヤーがリロードし、2番目のプレイヤーがガードしたことを意味します。2番目のターンで、最初のプレイヤーが射撃し、2番目のプレイヤーがリロードします。プレイヤー1がこのゲームに勝ちます。同じ入力は、必要に応じとして表すことができ"r g f r"
、"rgfr"
、"rg fr"
"rg-fr"
...
次のことを想定できます。
入力は選択した形式と一致し、有効な文字のみが含まれます。
誰かが100ターン以内に死にます。
ただし、誰かが死んだときにターンが終了すると想定することはできません。
出力
誰が勝ったか(または誰が最初に勝ったか)を示す値*
。各シナリオで何を出力するかを選択できますが、次のことを考慮する必要があります。
プレイヤー1が勝利
プレイヤー2が勝利
彼らはお互いを殺します(引く)
各結果には地区値が必要であり、各シナリオで常に同じでなければなりません。
例として、1
プレーヤー1が勝った2
とき、プレーヤー2が勝ったとき、および0
引き分けの場合に出力できます。プレーヤー1が勝ったとき、プレーヤー2が勝ったとき、および引き分けの場合は常に出力する必要があります。1
2
0
返されるか、標準出力に出力されます。末尾の空白は問題ありません。
明らかなように、引き分けにつながる唯一のシナリオは、両方のプレイヤーが射撃し、両方が弾薬を持っている場合です。
*
このチャレンジでは、誰かが死亡した後もターンが続く可能性があるため、最終的には1人以上のプレイヤーが勝つ可能性があります。入力に従って最初に勝った人を見つける必要があります。
テストケース(1
P1が勝った2
とき、P2が勝ったとき0
、引き分けの場合):
"rg fr" => 1 (P1 shot P2 while they were reloading)
"rg ff" => 1 (They both shot, but only P1 had ammo)
"rr ff" => 0 (Both had ammo and shot each other)
"rr ff rr fg" => 0 (Both had ammo and shot each other. Everything after the first win is ignored)
"rr fg rf" => 2 (P2 shot P1 while they were reloading)
"rf gg rr fg rr fr" => 1
(P2 tried to shoot but didn't have any ammo, then they both guarded, then they both reloaded, then P2 blocked a shot, then they both reloaded again [but P2 still only has 1 ammo!], then P1 shoots P2 while they're reloading.
"rr gf fr rf gg rg ff" => 1
^ Player 1 wins here. The rest to the right has no effect on the output
これはコードゴルフなので、最小バイト数が勝ちです!
テストケースが示すように、「ダム」移動を処理する必要があることに注意してください。プレイヤーが弾薬を持っていないときに射撃を試みるか、2ターン連続でリロードする(そして弾薬を1つだけ蓄積する)ことは完全に有効です。
{"rff","rgf"}
か?