Trouvez le résultat d'un jeu de guerre
Quand j'étais à l'école primaire, il y avait un jeu "Rock-Paper-Scissors" que nous jouions pendant les assemblées, en attendant notre professeur, à la récréation, etc. Nous l'appelions "Guerre". Après quelques recherches cependant, il s'avère que c'est une variante beaucoup plus simple du "Shotgun Game" (selon WikiHow) . Je vais l'appeler "Guerre" car les règles sont légèrement différentes:
2 personnes sont assises l'une en face de l'autre. Le but du jeu est de "tuer" l'autre joueur. Chaque tour, vous pouvez jouer l'un des 3 coups:
Recharger : Vous avez un pistolet qui détient un seul coup. Il doit être rechargé avant de pouvoir être tiré à chaque fois. Le rechargement lorsque vous avez déjà des munitions est légal, mais ne fait rien. Un rechargement était symbolisé en tapant sur vos tempes avec les deux mains. Chaque joueur commence avec 0 munitions.
Garde : Le seul mouvement sûr. Si vous êtes abattu alors que vous gardez, vous ne mourrez pas. La garde était symbolisée en croisant vos bras sur votre poitrine.
Feu : tirez avec votre arme. Pour réussir le tir, vous devez avoir rechargé depuis le dernier tir. Si votre adversaire recharge, vous gagnez. S'ils tirent également et que vous avez tous les deux des munitions, c'est un match nul. S'ils gardent, vous avez gaspillé les munitions. Bien que tirer sans munitions soit légal, cela ne fait rien et vous rend vulnérable comme le rechargement. Le tir était symbolisé en pointant l'autre joueur.
Cela se jouait de la même manière que le RPS, en ce que chaque joueur rejette simultanément son choix (nous nous tapotions les jambes deux fois entre les tours pour garder le rythme les uns avec les autres, mais ce n'est pas important pour le défi).
Le défi:
Votre tâche est de trouver le résultat d'un jeu de guerre. Il peut s'agir d'une fonction ou d'un programme complet.
Contribution
L'option choisie par chaque joueur à chaque tour sera représentée par un caractère / chaîne:
r : recharger
g : garde
f : feu
L'entrée sera une liste de paires, une chaîne délimitée / non délimitée ou toute autre chose le long de ces lignes.
Un exemple d'entrée en Python pourrait être [("r", "g"), ("f", "r")]
, ce qui signifie qu'au premier tour, le premier joueur rechargé et le deuxième joueur gardé. Au deuxième tour, le premier joueur tire, tandis que le deuxième joueur recharge. Le joueur un gagne ce match. Pourrait éventuellement l'entrée même être représentée comme "r g f r"
, "rgfr"
, "rg fr"
"rg-fr"
...
Vous pouvez supposer ce qui suit:
La saisie correspondra au format choisi et ne contiendra que des caractères valides.
Quelqu'un mourra dans les 100 tours.
Vous ne pouvez cependant pas supposer que les virages se terminent lorsque quelqu'un décède.
Production
Une valeur indiquant qui a gagné (ou qui a gagné en premier *
). Vous pouvez choisir les éléments à afficher pour chaque scénario, mais vous devez tenir compte des éléments suivants:
Le joueur 1 gagne
Le joueur 2 gagne
Ils s'entretuent (dessine)
Chaque résultat doit avoir une valeur de district et doit toujours être le même pour chaque scénario.
À titre d'exemple: vous pouvez générer des résultats 1
lorsque le joueur 1 gagne, 2
lorsque le joueur 2 gagne et 0
en cas d'égalité. Vous devez ensuite toujours sortir 1
lorsque le joueur 1 gagne, 2
lorsque le joueur 2 gagne et 0
en cas d'égalité.
Il peut être retourné ou imprimé sur la sortie standard. La fin des espaces blancs est très bien.
Juste pour que ce soit clair, le seul scénario qui mène à un match nul est si les deux joueurs tirent, et les deux ont des munitions.
*
Étant donné que dans ce défi, les tours peuvent continuer après la mort de quelqu'un, il est possible que plus d'un joueur gagne finalement. Vous devez trouver qui a gagné en premier selon l'entrée.
Cas de test (en supposant 1
que P1 gagne, 2
lorsque P2 gagne et 0
pour un match nul):
"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
C'est du golf de code, donc le plus petit nombre d'octets gagne!
Notez que, comme le montrent les cas de test, vous devez gérer les mouvements "stupides". Il est parfaitement valable pour un joueur d'essayer de tirer lorsqu'il n'a pas de munitions, ou de recharger 2 tours de suite (et d'accumuler une seule munition).
{"rff","rgf"}
?