Encontre o resultado de um jogo de guerra
Quando eu estava na escola primária, havia um jogo de "Pedra-Papel-Tesoura" que brincávamos durante as assembléias, enquanto aguardávamos nosso professor, no recreio etc. Chamamos de "Guerra". Depois de algumas pesquisas, porém, verifica-se que essa é uma variante muito mais simples do "Jogo de espingarda" (de acordo com o WikiHow) . Vou chamá-lo de "Guerra", pois as regras são um pouco diferentes:
2 pessoas se sentam em frente uma da outra. O objetivo do jogo é "matar" o outro jogador. A cada turno, você pode executar um dos três movimentos:
Recarregar : Você tem uma arma que detém um único tiro. Ele deve ser recarregado antes de poder ser disparado a cada vez. Recarregar quando você já tem munição é legal, mas não faz nada. Uma recarga foi simbolizada tocando nas têmporas com as duas mãos. Cada jogador começa com 0 munição.
Guarda : O único movimento seguro. Se você é baleado enquanto guarda, você não morre. A guarda foi simbolizada cruzando os braços sobre o peito.
Fogo : Dispare sua arma. Para disparar com sucesso, você deve ter recarregado desde o último tiro. Se o seu oponente estiver recarregando, você ganha. Se eles também dispararem, e vocês dois tiverem munição, é um empate. Se eles estão guardando, você desperdiçou a munição. Embora disparar sem munição seja uma jogada legal, ele não faz nada e o deixa vulnerável como recarregar. O disparo foi simbolizado apontando para o outro jogador.
Foi jogado de forma semelhante ao RPS, em que cada jogador joga simultaneamente a sua escolha (batemos as pernas duas vezes entre turnos para manter o ritmo um com o outro, mas isso não é importante para o desafio).
O desafio:
Sua tarefa é encontrar o resultado de um jogo de guerra. Pode ser uma função ou programa completo.
Entrada
A opção que cada jogador escolheu a cada turno será representada por um personagem / sequência:
r : recarregar
g : guarda
f : fogo
A entrada será uma lista de pares, uma sequência delimitada / não delimitada ou qualquer outra coisa nesse sentido.
Um exemplo de entrada em Python poderia ser [("r", "g"), ("f", "r")]
, ou seja , no primeiro turno, o primeiro jogador recarregou e o segundo jogador guardou. No segundo turno, o primeiro jogador dispara, enquanto o segundo jogador é recarregado. O jogador um vence este jogo. A mesma entrada pode, opcionalmente, ser representada como "r g f r"
, "rgfr"
, "rg fr"
"rg-fr"
...
Você pode assumir o seguinte:
A entrada corresponderá ao formato escolhido e conterá apenas caracteres válidos.
Alguém vai morrer dentro de 100 turnos.
No entanto, você não pode assumir que os turnos terminam quando alguém morre.
Resultado
Um valor que indica quem ganhou (ou quem ganhou primeiro *
). Você pode escolher o que produzir para cada cenário, mas deve levar em consideração o seguinte:
Jogador 1 vence
Jogador 2 vence
Eles se matam (empate)
Cada resultado deve ter um valor de distrito e sempre deve ser o mesmo para cada cenário.
Como exemplo: você pode exibir 1
quando o jogador 1 vence, 2
quando o jogador 2 vence e 0
em caso de empate. Você deve sempre produzir 1
quando o jogador 1 vencer, 2
quando o jogador 2 vencer e 0
em caso de empate.
Ele pode ser retornado ou impresso no stdout. O espaço em branco à direita é bom.
Só para esclarecer, o único cenário que leva a um empate é se ambos os jogadores disparam e ambos têm munição.
*
Como neste desafio, os turnos podem continuar depois que alguém morre, é possível que mais de um jogador possa vencer eventualmente. Você precisa descobrir quem ganhou primeiro, de acordo com a entrada.
Casos de teste (assumindo 1
quando P1 vence, 2
quando P2 vence e 0
empata):
"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
Isso é código de golfe, então o menor número de bytes vence!
Observe que, como mostram os casos de teste, você deve manipular movimentos "burros". É perfeitamente válido para um jogador tentar atirar quando não tem munição ou recarregar 2 turnos seguidos (e acumular apenas uma única munição).
{"rff","rgf"}
?