Erstellen Sie eine Funktion, die zwei Zeichenfolgen als Eingabe verwendet und eine einzige Ausgabe für das Ergebnis zurückgibt. Die beliebteste Antwort gewinnt.
Die Regeln von Rock-Paper-Scissors-Lizard-Spock sind:
- Schere schneiden Papier
- Papier bedeckt Stein
- Rock zerquetscht Eidechse
- Eidechse vergiftet Spock
- Spock zerschmettert eine Schere
- Schere enthauptet Eidechse
- Eidechse isst Papier
- Papier widerlegt Spock
- Spock verdampft den Stein
- Rock bricht die Schere
Die Ausgabe für jeden möglichen Eingabefall ist:
winner('Scissors', 'Paper') -> 'Scissors cut Paper'
winner('Scissors', 'Rock') -> 'Rock breaks Scissors'
winner('Scissors', 'Spock') -> 'Spock smashes Scissors'
winner('Scissors', 'Lizard') -> 'Scissors decapitate Lizard'
winner('Scissors', 'Scissors') -> 'Scissors tie Scissors'
winner('Paper', 'Rock') -> 'Paper covers Rock'
winner('Paper', 'Spock') -> 'Paper disproves Spock'
winner('Paper', 'Lizard') -> 'Lizard eats Paper'
winner('Paper', 'Scissors') -> 'Scissors cut Paper'
winner('Paper', 'Paper') -> 'Paper ties Paper'
winner('Rock', 'Spock') -> 'Spock vaporizes Rock'
winner('Rock', 'Lizard') -> 'Rock crushes Lizard'
winner('Rock', 'Scissors') -> 'Rock breaks Scissors'
winner('Rock', 'Paper') -> 'Paper covers Rock'
winner('Rock', 'Rock') -> 'Rock ties Rock'
winner('Lizard', 'Rock') -> 'Rock crushes Lizard'
winner('Lizard', 'Spock') -> 'Lizard poisons Spock'
winner('Lizard', 'Scissors') -> 'Scissors decapitate Lizard'
winner('Lizard', 'Paper') -> 'Lizard eats Paper'
winner('Lizard', 'Lizard') -> 'Lizard ties Lizard'
winner('Spock', 'Rock') -> 'Spock vaporizes Rock'
winner('Spock', 'Lizard') -> 'Lizard poisons Spock'
winner('Spock', 'Scissors') -> 'Spock smashes Scissors'
winner('Spock', 'Paper') -> 'Paper disproves Spock'
winner('Spock', 'Spock') -> 'Spock ties Spock'
Zusätzliche von @Sean Cheshire vorgeschlagene Herausforderung: Zulassen von benutzerdefinierten Listen, z. B. von dieser Site. Mit der n-Item-Liste verliert das Item gegen das vorherige (n-1) / 2 und gewinnt über das folgende (n-1) / 2
popularity-contest
Dansalmo
quelle
quelle
Antworten:
APL
In allen Fällen exakt die erforderliche Ausgabe, einschließlich Krawatten. Keine Nachschlagetabelle, außer den eigentlichen Wörtern.
Sie können es unter http://ngn.github.io/apl/web/ ausprobieren.
APL weiß es einfach!
quelle
SED
quelle
Hier ist eine allgemeine Lösung, die auf einer Regelzeichenfolge beliebiger Größe basiert. Es führt die korrekte Groß- und Kleinschreibung für den Eigennamen "Spock" durch und erlaubt außerdem Regeln für die Angabe von "Krawatte" anstelle von "Krawatten" für mehrere Objekte.
Ergebnisse:
quelle
rules
Sie anstelle der wörtlichen Verkettung eine mehrzeilige Zeichenfolge verwenden. Auf diese Weise können Sie die redundanten Klammern entfernen.Python
quelle
Python
quelle
Ruby, arithmetischer Ansatz
Die Akteure können in einer Reihe so angeordnet werden, dass jeder Akteur
a[i]
gegen die Akteure gewinnt,a[i+1]
unda[i+2]
modulo 5 zum Beispiel:Dann können wir für einen Schauspieler
A
mit Indexi
sehen, wie er mit einem SchauspielerB
mit Index übereinstimmt, indem wir Folgendesj
tunresult = (j-i)%5
: Ergebnis1
und2
bedeutet, dass Schauspieler A gegen einen Schauspieler 1 oder 2 Plätze vor ihm gewonnen hat;3
und4
bedeutet in ähnlicher Weise, dass er gegen einen Schauspieler hinter sich in der Reihe verloren hat.0
bedeutet ein Unentschieden. (Beachten Sie, dass dies sprachabhängig sein kann; in Ruby(j-i)%5 == (5+j-i)%5
auch, wennj>i
.)Der interessanteste Teil meines Codes ist die Verwendung dieser Eigenschaft, um eine Sortierfunktion der Indizes zweier Akteure zu finden. Der Rückgabewert wird -1, 0 oder 1 sein, wie es sollte :
Hier ist das Ganze:
quelle
Python
Mit einem kniffligen Wörterbuch.
quelle
return(' '.join([p,'tie' + 's'*(p[1]!='c'),q]))
wird die Zeitform korrekt bekommen.C #
Annahmen
Die Gegner sind in einem n-Item-Array angeordnet, in dem die Spieler die (n-1) / 2 Spieler vor sich schlagen und gegen die (n-1) / 2 Spieler hinter sich verlieren. (Bei Listen mit gerader Länge verliert der Spieler gegen die ((n-1) / 2 + 1) Spieler dahinter)
Spieleraktionen sind in einem Array angeordnet, in dem Aktionen im Bereich von [(indexOfPlayer * (n-1) / 2)] bis [(indexOfPlayer * (n-1) / 2)) + (n-2) / 2-1 liegen ].
Zusätzliche Information
CircularBuffer<T>
ist ein Wrapper um ein Array, um ein "unendlich" adressierbares Array zu erstellen. DieIndexOf
Funktion gibt den Index eines Elements innerhalb der tatsächlichen Grenzen des Arrays zurück.Die Klasse
Beispiel
quelle
Python, Einzeiler
quelle
.split(', ')
und müssen nicht zusammen jammen.Nur eine kleine Sache, die ich mir ausgedacht habe:
Hier ist rules die Datei, die alle Regeln enthält, die angegeben wurden.
quelle
Python
Inspiriert von @ Tobias APL-Code.
Ergebnisse:
quelle
C ++
Ein bisschen wie ein Test
quelle
Javascript
quelle
Javascript
Ich sehe, dass dies kein Golfwettbewerb ist, aber ich habe eine Weile an diesem Rätsel herumgespielt, bevor ich diesen Thread gefunden habe.
Hier ist eine (Standard-) js-Version mit 278 Zeichen:
Oder eine mit E6-Funktionen (funktioniert wahrscheinlich nur in Firefox) in 259 Zeichen:
quelle