전쟁 게임의 결과 찾기
제가 초등학교에있을 때, 우리는 "바위 가위"게임을했습니다. 우리는 선생님을 기다릴 때나 쉬는 시간에 어셈블리를 할 때 할 것입니다. 우리는 "전쟁"이라고 불렀습니다. 그러나 일부 검색 후, 이것은 WikiHow에 따르면 "Shotgun Game" 의 훨씬 간단한 변형입니다 . 규칙이 약간 다르기 때문에 "War"라고 부르겠습니다.
두 사람이 서로 가로 질러 앉아 있습니다. 게임의 목표는 상대방을 "죽이는"것입니다. 매 턴마다 3 개의 동작 중 하나를 재생할 수 있습니다.
재 장전 : 당신은 한 발의 총을 가지고 있습니다. 매번 발사하기 전에 다시로드해야합니다. 이미 탄약을 가지고있을 때 재장 전하는 것은 합법적이지만 아무것도하지 않습니다. 재 장전은 양손으로 사원을 두드려 상징되었습니다. 각 플레이어는 0 탄약으로 시작합니다.
가드 : 유일한 안전한 움직임. 지키는 동안 총을 맞으면 죽지 않습니다. 가슴 위로 팔을 교차시켜 보호를 상징했습니다.
발사 : 총을 발사하십시오. 성공적으로 발사하려면 마지막 사격 이후 재장 전해야합니다. 상대방이 재 장전하면 승리합니다. 그들이 또한 발사하고 둘 다 탄약을 가지고 있다면, 그것은 무승부입니다. 그들이 지키고 있다면, 당신은 탄약을 낭비합니다. 탄약없이 발사하는 것은 합법적 인 행동이지만, 아무것도하지 않으며 재장 전처럼 취약합니다. 발사는 다른 선수를 가리키는 것으로 상징되었습니다.
RPS와 비슷하게 플레이되었습니다. 각 플레이어는 동시에 자신의 선택을 포기합니다 (우리는 다리 사이를 두 번 두드려서 서로 리듬을 유지하지만 도전에는 중요하지 않습니다).
도전 과제 :
당신의 임무는 전쟁 게임의 결과를 찾는 것입니다. 함수 또는 전체 프로그램 일 수 있습니다.
입력
각 플레이어가 각 턴에서 선택한 옵션은 문자 / 문자열로 표시됩니다.
r : 새로 고침
g : 가드
f : 불
입력은 쌍의 목록, 구분 / 구분되지 않은 문자열 또는 이러한 행을 따르는 다른 항목이됩니다.
Python의 입력 예 [("r", "g"), ("f", "r")]
는 첫 번째 플레이어가 다시로드되고 두 번째 플레이어가 보호되는 것을 의미합니다. 두 번째 턴에서는 첫 번째 플레이어가 발사되고 두 번째 플레이어가 다시로드됩니다. 플레이어 1 명이이 게임에서 승리합니다. 동일한 입력이 선택적으로 표시 될 수있는 "r g f r"
, "rgfr"
, "rg fr"
"rg-fr"
...
다음을 가정 할 수 있습니다.
입력 한 내용은 선택한 형식과 일치하며 유효한 문자 만 포함합니다.
누군가 100 턴 안에 죽을 것입니다.
그러나 누군가 죽으면 회전이 끝났다고 가정 할 수는 없습니다.
산출
누가 이겼는지 (또는 누가 먼저 이겼는지) 나타내는 값 *
입니다. 각 시나리오에 대해 출력 할 항목을 선택할 수 있지만 다음을 고려해야합니다.
플레이어 1 승리
플레이어 2 승리
그들은 서로를 죽입니다 (무승부)
각 결과에는 지구 가치가 있어야하며 각 시나리오마다 항상 동일해야합니다.
예를 들어 1
, 플레이어 1이 이길 2
때, 플레이어 2가 이길 때 그리고 0
추첨의 경우에 출력 할 수 있습니다. 그런 다음 플레이어 1이 이길 때, 플레이어 2가 이길 때 그리고 추첨의 경우 항상 출력 해야합니다 .1
2
0
반환하거나 stdout에 인쇄 할 수 있습니다. 후행 공백이 좋습니다.
확실히, 무승부로 이어지는 유일한 시나리오는 두 선수가 모두 발사하고 둘 다 탄약을 가지고있는 경우입니다.
*
이 도전에서 누군가가 죽은 후에도 턴이 계속 될 수 있기 때문에 결국 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 턴을 연속으로 재 장전 (단일 탄약 만 축적)하는 것은 유효합니다.
{"rff","rgf"}
?