Znajdź wynik gry wojennej
Kiedy byłem w szkole podstawowej, była gra „Rock-Paper-Scissors”, w którą graliśmy podczas zgromadzeń, czekając na nauczyciela, w przerwie itp. Nazwaliśmy to „Wojną”. Jednak po kilku poszukiwaniach okazuje się, że jest to znacznie prostsza odmiana „Strzelby” (według WikiHow) . Nazywam to „Wojną”, ponieważ zasady są nieco inne:
2 osoby siedzą naprzeciwko siebie. Celem gry jest „zabicie” drugiego gracza. W każdej turze możesz wykonać jeden z 3 ruchów:
Przeładuj : masz broń, która trzyma pojedynczy strzał. Musi zostać przeładowany, zanim będzie można go wystrzelić za każdym razem. Przeładowywanie, gdy masz już amunicję, jest legalne, ale nic nie robi. Przeładowanie zostało symbolizowane przez stuknięcie świątyń obiema rękami. Każdy gracz zaczyna od 0 amunicji.
Strażnik : jedyny bezpieczny ruch. Jeśli zostaniesz postrzelony podczas obrony, nie umrzesz. Ochrona symbolizowana była przez skrzyżowanie rąk nad klatką piersiową.
Ogień : wystrzel swoją broń. Aby skutecznie strzelać, musisz przeładować od ostatniego strzału. Jeśli twój przeciwnik przeładowuje, wygrywasz. Jeśli oni również strzelają, a oboje macie amunicję, jest to remis. Jeśli pilnują, zmarnowałeś amunicję. Podczas gdy strzelanie bez amunicji jest legalnym posunięciem, nic nie robi i pozostawia cię bezbronnym jak przeładowanie. Strzelanie było symbolizowane przez wskazanie na drugiego gracza.
Rozgrywano go podobnie do RPS, ponieważ każdy gracz jednocześnie odrzuca swój wybór (dwukrotnie stukaliśmy nogami między turami, aby zachować rytm, ale to nie jest ważne dla wyzwania).
Wyzwanie:
Twoim zadaniem jest znalezienie wyniku gry wojennej. Może to być funkcja lub pełny program.
Wejście
Opcja wybrana przez każdego gracza w każdej turze będzie reprezentowana przez postać / ciąg znaków:
r : przeładuj
g : strażnik
f : ogień
Dane wejściowe będą listą par, ciągiem rozdzielanym / nieosiąganym, lub cokolwiek innego wzdłuż tych linii.
Przykładowym wejściem w Pythonie może być [("r", "g"), ("f", "r")]
, co oznacza, że w pierwszej turze pierwszy gracz zostanie przeładowany, a drugi gracz będzie strzeżony. W drugiej turze pierwszy gracz strzela, a drugi gracz przeładowuje. Gracz pierwszy wygrywa tę grę. Te same dane wejściowe mogą być ewentualnie reprezentowane "r g f r"
, "rgfr"
, "rg fr"
"rg-fr"
...
Możesz założyć, co następuje:
Dane wejściowe będą pasować do wybranego przez Ciebie formatu i będą zawierać tylko prawidłowe znaki.
Ktoś umrze w ciągu 100 tur.
Nie możesz jednak założyć, że tury kończą się, gdy ktoś umrze.
Wynik
Wartość wskazująca, kto wygrał (lub kto wygrał jako pierwszy *
). Możesz wybrać dane wyjściowe dla każdego scenariusza, ale musisz uwzględnić następujące kwestie:
Gracz 1 wygrywa
Gracz 2 wygrywa
Zabijają się nawzajem (remis)
Każdy wynik musi mieć wartość dzielnicową i zawsze musi być taki sam dla każdego scenariusza.
Na przykład: możesz wypisywać, 1
gdy gracz 1 wygrywa, 2
gdy gracz 2 wygrywa, aw 0
przypadku remisu. Musisz wtedy zawsze generować, 1
gdy gracz 1 wygra, 2
gdy gracz 2 wygra, a także 0
w przypadku remisu.
Można go zwrócić lub wydrukować na standardowe wyjście. Końcowe białe znaki są w porządku.
Żeby było jasne, jedynym scenariuszem prowadzącym do losowania jest sytuacja, gdy obaj gracze strzelają i obaj mają amunicję.
*
Ponieważ w tym wyzwaniu tury mogą być kontynuowane po śmierci kogoś, możliwe, że więcej niż jeden gracz może wygrać. Musisz dowiedzieć się, kto wygrał jako pierwszy, zgodnie z danymi wejściowymi.
Przypadki testowe (zakładając, 1
kiedy wygrywa P1, 2
kiedy wygrywa P2 i 0
remis):
"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
To jest golf golfowy, więc wygrywa najmniejsza liczba bajtów!
Uwaga: jak pokazują przypadki testowe, musisz obsługiwać „głupie” ruchy. Jest całkowicie uzasadnione, że gracz próbuje strzelać, gdy nie ma amunicji lub przeładowuje 2 tury z rzędu (i gromadzi tylko jedną amunicję).
{"rff","rgf"}
?