Es gibt eine Reihe von Fragen in Bezug auf dieses Spiel , auch ein King-of-the-Hill Wettbewerb hier . Aber ich denke, all diese Herausforderungen und Wettbewerbe erfordern eine Möglichkeit, den Gewinner eines Spiels automatisch zu ermitteln. So:
Herausforderung
Bestimmen Sie bei zwei Eingaben im Bereich, ["rock", "paper", "scissors", "lizard", "spock"]
die die Auswahl für Spieler 1 und Spieler 2 darstellen, den Sieger des Spiels.
Regeln
[Winner] [action] [loser]
-----------------------------
scissors cut paper
paper covers rock
rock crushes lizard
lizard poisons spock
spock smashes scissors
scissors decapitates lizard
lizard eats paper
paper disproves spock
spock vaporizes rock
rock crushes scissors
Beschränkungen
- Die Eingabe erfolgt als Paar von Zeichenfolgen im angegebenen Bereich (es können keine anderen Zeichenfolgen verwendet werden). Wenn Sie möchten, können Sie Arrays von Zeichen verwenden, sofern diese einen der genannten Werte darstellen.
- Sie können wählen, ob für die Eingabezeichenfolgen Kleinbuchstaben, Großbuchstaben (
"ROCK"
) oder Kamelbuchstaben ("Rock"
) verwendet werden sollen, sofern die Groß- und Kleinschreibung für alle Eingaben gleich ist. - Es werden drei Werte ausgegeben, die den Gewinner bestimmen. Dies kann alles sein, was Sie wollen, solange die Antworten konsistent sind. Beispiel:
1
Wenn der erste Eingang gewinnt,2
wenn der zweite Eingang gewinnt,0
wenn ein Gleichstand besteht. Oder vielleicht,A
wenn der erste Eingang gewinnt,B
wenn der zweite Eingang gewinnt,<empty string>
wenn es ein Unentschieden gibt.
Tor
Das ist Code-Golf , also kann das kürzeste Programm / die kürzeste Methode / Funktion / Lambda für jede Sprache gewinnen!
Tests
[Input 1] [Input 2] [Output: 1/2/0]
-----------------------------------
rock paper 2
rock scissors 1
lizard spock 1
spock rock 1
spock paper 2
rock rock 0
cake
Trick).Antworten:
Python 3 ,
685048 BytesEDIT: Dank 3 Tricks von Neil und 2 von Mr. Xcoder
Jede Eingabezeichenfolge hat ein unterschiedliches viertes Zeichen, daher benutze ich dieses, um sie zu unterscheiden. Wenn Sie die Elemente im Zyklus anordnen (Schere, Papier, Stein, Eidechse, Spock), schlägt jedes Element das Element direkt danach, und das Element 3 wird zyklisch nach rechts verschoben. Wir subtrahieren also die Positionen der Eingänge im Zyklus. Wenn diese Zahl 0 ist, ist es ein Unentschieden. Wenn es 1 oder 3 ist, ist es ein Gewinn für den ersten Spieler. In meiner ursprünglichen Lösung würde die Zyklusdifferenz in die Zeichenfolge "210100" indiziert, um die Ergebnisse des Spiels zu unterscheiden. Neil hat irgendwie herausgefunden, dass dies ohne Indizierung erreicht werden kann, indem er 7 addiert und den Modul durch 3 nimmt. Bearbeiten: Ursprünglich habe ich das zweite Zeichen verwendet, um die Zeichenfolge zu identifizieren. Und wir könnten alle mehr Kuchen gebrauchen.
Probieren Sie es online!
Ältere Version:
Probieren Sie es online!
Originalfassung:
Probieren Sie es online!
quelle
.index
zu.find
)p
,"chaoi"
reicht aus)JavaScript (ES6), 56 Byte
Übernimmt Eingaben in der Currying-Syntax
(a)(b)
. Gibt zurück,0
wenn A gewinnt,1
wenn B gewinnt oderfalse
für ein Unentschieden.Demo
Code-Snippet anzeigen
Wie?
Wir definieren die Hash-Funktion H () als:
Das gibt:
Bei zwei Eingaben a und b betrachten wir die folgenden Aussagen:
Aus (1) und (2) leiten wir ab, ob das Ergebnis von a> b invertiert werden soll, um den richtigen Gewinner zu erhalten, und speichern dieses Flag im N-ten Bit einer Nachschlagebitmaske.
Daher die Bits:
Wenn Sie dies von unten nach oben lesen und führende Nullen ignorieren, erhalten Sie 1001100110 oder 614 als Dezimalzahl.
quelle
05AB1E , 16 Bytes
Probieren Sie es online! oder als Test Suite
Erläuterung
Verwendet den sehr netten
cake
-trick von user507295quelle
JavaScript (ES6),
63545349 BytesPort von meinem Golf auf @ WhatToDo Antwort. Hinweis: Das Snippet dekodiert das numerische Ergebnis in etwas weniger Unlesbares. Bearbeiten: 1 Byte dank @Arnauld gespeichert. 4 Bytes dank @ovs gespeichert.
quelle
Ruby , 36 Bytes
Gibt zurück,
0
wenn der 1. Spieler gewinnt,1
wenn der 2. Spieler gewinnt, und2
für ein Unentschieden.Basierend auf der Antwort von user507295, verwendet jedoch eine mathematische Formel, um den Hash auszuführen.
a.sum
ist die Summe aller ASCII-Codes des Stringsa
mod1<<16
und ist als rudimentäre Prüfsumme gedacht. Der Hash wurde mit dem folgenden Code gefunden:Dies
j
ergab zwei Werte , die einen geeigneten Hash für Kleinbuchstaben ergaben, nämlich 88 und 80, die beide die absteigende Reihenfolge ergaben[3,2,1,0,4]
(oder[4,3,2,1,0]
wenn Spock an den Anfang gedreht wird).Wie in anderen Antworten erläutert, wird ein Hash benötigt, der für aufeinanderfolgende Elemente in der obigen Sequenz ein konstantes Differenzmodul 5 ergibt, damit die
(h[a]-h[b])%5
Formel funktioniert. Jedes Element schlägt das Element um 1 oder 3 Stellen nach rechts und verliert gegen das Element um 2 oder 4 Stellen nach rechts.Probieren Sie es online!
quelle
C 53 Bytes
Ich habe dieses Problem als eine Zustandsmaschine behandelt, von der es 25 Zustände gibt, wie durch die zwei, fünf Zustandseingaben definiert.
Durch Definieren der Ergebnisse der Zustände in einem Array von Bits. Ich überprüfe die Ergebnisse anhand eindeutiger Markierungen in den Eingaben.
Wie in anderen Lösungen erwähnt, sind die Zeichen 2, 3 und 4 zwischen den möglichen Eingaben eindeutig. Ich habe mich auf die Zeichen 2 und 3 konzentriert, mit denen ich das entsprechende Bit in meinem Antwortfeld auswähle.
Innerhalb von Zeichen 2 kennzeichnen die Bits 1 bis 4 die Eingabe eindeutig. Durch Maskieren dieser Bits und entsprechendes Verschieben [das ist das "* y & 47 >> 1"] kann die Eingabe als 0, 1, 4, 7 oder 8 notiert werden. Daher hat meine Antwortzeichenfolge 9 Zeichen. (getrennte interessante Bits)
Innerhalb des Zeichens 3 kennzeichnen die Bits 0, 1 und 2 den Eingang eindeutig. Durch Maskieren dieser Bits (Verschieben nicht erforderlich) [das ist das "* x & 7"] kann die Eingabe als 0, 1, 2, 3 oder 7 notiert werden. (getrennte interessante Bits)
Die Antwortzeichenfolge kann dann berechnet werden, indem einfach die Bits für die entsprechenden Zeichen eingegeben werden.
Also setze ein Bit in char, wo Y gewinnt
Dann lautet die Logik einfach: Wenn das zweite Zeichen dasselbe ist, dann zeichne, andernfalls erhalte ASCII-Zeichen basierend auf dem zweiten Zeichen von y und verschiebe Bits um das dritte Zeichen von x und addiere eins. Dies macht die Antworten 0 für Unentschieden, 1 für x gewinnen und 2 für y gewinnen.
quelle
Clojure,
130118 Bytes-12 Bytes durch meine seltsame Verwendung von loszuwerden
comp
.Ich dachte, ich wäre schlau, aber im Vergleich zu einigen anderen Antworten war das naiv und vieles mehr länger.
Nimmt die ersten 2 Buchstaben jeder Bewegungszeichenfolge, erhält die Zeichencodes und summiert sie. Es subtrahiert dann die Summen, um zu erhalten
d
. Wennd
0 ist, ist es ein Gleichstand (0), wenn es in der Menge von ist#{5 -16 12 -14 13 1 4 -18 2 11}
, gewinnt p1 (1), sonst gewinnt p2 (2).Um die "magischen Zahlen" zu erhalten, die definieren, ob P1 gewinnt, bin ich gelaufen
Welche generiert eine Liste von
d
Werten für jedes mögliche Szenario:Dann habe ich die Gewinnchart mit dieser Ausgabe verglichen. Zum Glück gab es außer 0 keine "Kollisionen".
quelle