Знайдіть результат гри Війна
Коли я навчався в початковій школі, була гра «Рок-папір-ножиці», в яку ми грали під час зборів, в очікуванні нашого вчителя, на перерві тощо. Ми називали це «війна». Однак після деяких пошуків виявляється, що це набагато простіший варіант "гри в рушницю" (за даними WikiHow) . Я буду називати це "Війна", оскільки правила дещо інші:
2 людини сидять навпроти один одного. Мета гри - «вбити» іншого гравця. Кожен хід ви можете грати одним із 3-х ходів:
Перезавантажте : у вас є пістолет, який вміщує один постріл. Він повинен бути перезавантажений, перш ніж його можна буде кожного разу звільнити. Перезавантаження, коли у вас вже є боєприпаси, є законним, але нічого не робить. Перезавантаження символізувалося постукуванням скронь обома руками. Кожен гравець починає з 0 боєприпасів.
Охорона : Єдиний безпечний хід. Якщо вас розстрілюють під час охорони, ви не помрете. Охорона символізувалась схрещуванням рук над грудьми.
Вогонь : Стріляйте з гармати. Для успішного запуску, ви повинні мати перезавантаження з останнього пострілу. Якщо ваш опонент перезавантажується, ви виграєте. Якщо вони теж ведуть вогонь, а у вас обох є патрони, це нічия. Якщо вони охороняють, ви витратили боєприпаси. Хоча стрілянина без боєприпасів - це законний хід, вона нічого не робить і залишає вас вразливими, як перезавантаження. Стрільба символізувалась вказівкою на іншого гравця.
Це було схоже на RPS, оскільки кожен гравець одночасно кидає свій вибір (ми двічі постукували по ногах між оборотами, щоб підтримувати ритм один з одним, але це не важливо для виклику).
Змагання:
Ваше завдання - знайти результат гри війни. Це може бути функція або повна програма.
Вхідні дані
Опція, яку кожен гравець обрав кожен виток, буде представлена символом / рядком:
r : перезавантажити
г : охоронець
f : вогонь
Вхідним записом буде список пар, обмежений / неозначений рядок або будь-що інше у цих рядках.
Приклад введення в Python може бути [("r", "g"), ("f", "r")]
, тобто під час першого повороту перший гравець перезавантажений, а другий гравець охороняється. На другому ходу перший гравець стріляє, а другий гравець перезавантажується. Гравець один виграє цю гру. Ж вхід може необов'язково бути представлена в вигляді "r g f r"
, "rgfr"
, "rg fr"
"rg-fr"
...
Ви можете припустити наступне:
Введення відповідатиме обраному формату та міститиме лише дійсні символи.
Хтось помре протягом 100 обертів.
Однак ви не можете припустити, що повороти закінчуються, коли хтось помирає.
Вихідні дані
Значення, що вказує, хто переміг (або хто виграв перший *
). Ви можете вибрати, що виводити для кожного сценарію, але потрібно враховувати наступне:
Гравець 1 перемагає
Гравець 2 виграє
Вони вбивають один одного (малюють)
Кожен результат повинен мати значення району і завжди повинен бути однаковим для кожного сценарію.
Як приклад: ви можете вивести, 1
коли гравець 1 перемагає, 2
коли гравець 2 перемагає, і 0
в разі нічиї. Тоді ви завжди повинні виводити, 1
коли гравець 1 перемагає, 2
коли гравець 2 перемагає, і 0
в разі нічиї.
Її можна повернути або роздрукувати у stdout. Трейлінг пробілу добре.
Просто для того, щоб було зрозуміло, єдиний сценарій, який призводить до нічиї - це якщо обидва гравці стріляють, і обоє мають боєприпаси.
*
Оскільки в цьому виклику повороти можуть продовжуватися після того, як хтось помирає, можливо, в підсумку може виграти більше одного гравця. Вам потрібно знайти, хто виграв першим відповідно до вкладених даних.
Тестові випадки (якщо припустити, 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 витки поспіль (і накопичувати лише одну боєприпаси).
{"rff","rgf"}
?