Finde das Ergebnis eines Kriegsspiels
Als ich in der Grundschule war, gab es ein "Rock-Paper-Scissors" -Spiel, das wir während der Versammlungen spielten, wenn wir auf unseren Lehrer warteten, in der Pause usw. Wir nannten es "Krieg". Nach einigem Suchen stellt sich jedoch heraus, dass dies eine viel einfachere Variante des "Shotgun Game" ist (laut WikiHow) . Ich werde es "Krieg" nennen, da die Regeln etwas anders sind:
2 Personen sitzen sich gegenüber. Das Ziel des Spiels ist es, den anderen Spieler zu "töten". In jeder Runde kannst du einen von 3 Zügen spielen:
Nachladen : Sie haben eine Waffe, die einen einzigen Schuss hält. Es muss neu geladen werden, bevor es jedes Mal abgefeuert werden kann. Nachladen, wenn Sie bereits Munition haben, ist legal, tut aber nichts. Ein Nachladen wurde symbolisiert, indem man mit beiden Händen auf die Schläfen tippte. Jeder Spieler beginnt mit 0 Munition.
Wache : Der einzige sichere Zug. Wenn Sie während der Bewachung erschossen werden, sterben Sie nicht. Die Bewachung wurde durch das Kreuzen der Arme über der Brust symbolisiert.
Feuer : Feuer deine Waffe. Um erfolgreich zu feuern, müssen Sie seit dem letzten Schuss neu geladen haben. Wenn dein Gegner nachlädt, gewinnst du. Wenn sie auch schießen und Sie beide Munition haben, ist es ein Unentschieden. Wenn sie Wache halten, haben Sie die Munition verschwendet. Ohne Munition zu schießen ist zwar ein legaler Schritt, aber es macht nichts und macht Sie angreifbar wie das Nachladen. Das Feuern wurde symbolisiert, indem auf den anderen Spieler gezeigt wurde.
Es wurde ähnlich wie RPS gespielt, da jeder Spieler gleichzeitig seine Wahl fallen lässt (wir haben zwischen den Zügen zweimal mit den Beinen getippt, um im Rhythmus miteinander zu bleiben, aber das ist für die Herausforderung nicht wichtig).
Die Herausforderung:
Ihre Aufgabe ist es, das Ergebnis eines Kriegsspiels zu finden. Dies kann eine Funktion oder ein vollständiges Programm sein.
Eingang
Die Option, die jeder Spieler in jeder Runde gewählt hat, wird durch ein Zeichen / eine Zeichenkette dargestellt:
r : neu laden
g : Wache
f : Feuer
Die Eingabe ist eine Liste von Paaren, eine begrenzte / nicht begrenzte Zeichenfolge oder irgendetwas anderes in dieser Richtung.
Ein Beispiel für eine Eingabe in Python ist [("r", "g"), ("f", "r")]
, dass in der ersten Runde der erste Spieler neu geladen und der zweite Spieler bewacht wird. In der zweiten Runde schießt der erste Spieler, während der zweite Spieler nachlädt. Spieler eins gewinnt dieses Spiel. Das gleiche Eingangsgegebenenfalls wie dargestellt werden könnte "r g f r"
, "rgfr"
, "rg fr"
"rg-fr"
...
Sie können folgendes annehmen:
Die Eingabe entspricht dem von Ihnen gewählten Format und enthält nur gültige Zeichen.
Jemand wird innerhalb von 100 Runden sterben.
Sie können jedoch nicht davon ausgehen, dass die Züge enden, wenn jemand stirbt.
Ausgabe
Ein Wert, der angibt, wer gewonnen hat (oder wer zuerst gewonnen hat *
). Sie können für jedes Szenario auswählen, was ausgegeben werden soll, müssen jedoch Folgendes berücksichtigen:
Spieler 1 gewinnt
Spieler 2 gewinnt
Sie töten sich gegenseitig (Unentschieden)
Jedes Ergebnis muss einen Distriktwert haben und für jedes Szenario immer gleich sein.
Als Beispiel: Sie können ausgeben, 1
wann Spieler 1 gewinnt, 2
wann Spieler 2 gewinnt und 0
im Falle eines Unentschieden. Sie müssen dann immer dann ausgeben, 1
wenn Spieler 1 gewinnt, 2
wenn Spieler 2 gewinnt und 0
im Falle eines Unentschieden.
Es kann zurückgegeben oder auf die Standardausgabe gedruckt werden. Nachgestellte Leerzeichen sind in Ordnung.
Nur damit klar ist, ist das einzige Szenario, das zu einem Unentschieden führt, wenn beide Spieler schießen und beide Munition haben.
*
Da in dieser Herausforderung Züge fortgesetzt werden können, nachdem jemand gestorben ist, kann es sein, dass mehr als ein Spieler gewinnt. Sie müssen anhand der Eingabe herausfinden, wer zuerst gewonnen hat.
Testfälle (vorausgesetzt, 1
P1 gewinnt, 2
P2 gewinnt und 0
unentschieden):
"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
Das ist Codegolf, also gewinnt die kleinste Anzahl von Bytes!
Beachten Sie, wie die Testfälle zeigen, dass Sie mit "dummen" Bewegungen umgehen müssen. Es ist durchaus zulässig, dass ein Spieler versucht, zu schießen, wenn er keine Munition hat, oder 2 Runden hintereinander nachlädt (und nur eine einzige Munition ansammelt).
{"rff","rgf"}
?