Wenn Sie kurz nach dem 4. Mai eine Herausforderung mit einer Star Trek-Referenz angehen, kann dies verpönt sein.
Sie, Luke, Anakin, Palpatine, Yoda und Han Solo sind in ein verrücktes Turnier aus Rock, Paper, Scissor, Lizard, Spock verwickelt.
Der Haken hier ist, dass Sie nur eine feste Reihenfolge von Zügen verwenden dürfen. Wenn Ihr Befehl "R" lautet, müssen Sie Rock verwenden, bis Sie gegen alle verlieren oder gewinnen. Wenn Ihre Bestellung RRV ist, müssen Sie 2 Steine gefolgt von einem Spock verwenden und so lange wiederholen, bis Sie gewonnen oder verloren haben.
Luke, Anakin, Palpatine, Yoda und Han Solo haben ihre jeweiligen Bestellungen eingereicht und Sie, ein erfahrener Hacker, haben jede ihrer Bestellungen in die Hände bekommen!
Mit diesem Wissen müssen Sie Ihre Bestellung für das Turnier gestalten. Da jeder gewinnen möchte, möchten Sie eine Bestellung erstellen, bei der Sie das Turnier gewinnen, indem Sie alle schlagen. Dies ist jedoch möglicherweise nicht unter allen Umständen möglich.
Wenn es eine mögliche Gewinnreihenfolge gibt, drucken Sie diese aus. Wenn Sie nicht gewinnen können, drucken Sie -1 (oder 0 oder False oder "impossible") aus.
Eingabe : eine Liste von 5 Bestellungen
Ausgabe : eine einzelne Bestellung oder -1
Probeneingabe 1
R
P
S
L
V
Beispielausgabe 1
-1
Erklärung 1
Egal, was Sie in Ihrem ersten Zug spielen, es wird mindestens eine Person geben, die Sie schlägt, daher ist es nicht möglich, dass Sie gewinnen.
Probeneingabe 2
RPS
RPP
R
SRR
L
Beispielausgabe 2
RPSP
Erklärung 2
Sobald Sie in Ihrem ersten Zug Rock spielen, schlagen Sie "L" und "SRR" und binden gegen den Rest. Dies liegt daran, dass Lizard und Scissors gegen Rock verlieren. Wenn Sie das nächste Mal Papier spielen, schlagen Sie "R" und binden gegen die restlichen 2. Dies liegt daran, dass Rock gegen Papier verliert. Wenn Sie als nächstes Schere spielen, gewinnen Sie gegen "RPP", wenn Schere Papier schlägt.
Schließlich schlagen Sie "RPS" mit Ihrem Papier, während Papier Rock schlägt.
Hier ist eine Liste von Notationen (Sie können 5 Literale verwenden, aber bitte in Ihrer Antwort angeben):
R : Rock
P : Paper
S : Scissor
L : Lizard
V : Spock
Hier ist eine Liste aller möglichen Ergebnisse:
winner('S', 'P') -> 'S'
winner('S', 'R') -> 'R'
winner('S', 'V') -> 'V'
winner('S', 'L') -> 'S'
winner('S', 'S') -> Tie
winner('P', 'R') -> 'P'
winner('P', 'V') -> 'P'
winner('P', 'L') -> 'L'
winner('P', 'S') -> 'S'
winner('P', 'P') -> Tie
winner('R', 'V') -> 'V'
winner('R', 'L') -> 'R'
winner('R', 'S') -> 'R'
winner('R', 'P') -> 'P'
winner('R', 'R') -> Tie
winner('L', 'R') -> 'R'
winner('L', 'V') -> 'L'
winner('L', 'S') -> 'S'
winner('L', 'P') -> 'L'
winner('L', 'L') -> Tie
winner('V', 'R') -> 'V'
winner('V', 'L') -> 'L'
winner('V', 'S') -> 'V'
winner('V', 'P') -> 'P'
winner('V', 'V') -> Tie
Das ist Code-Golf , so dass nur wenige Bytes gewinnen.
PS: Lass es mich wissen, wenn du mehr Testfälle brauchst.
Antworten:
Gelee , 29 Bytes
Ein monadischer Link, der eine Liste von Ganzzahllisten akzeptiert (von denen jede die Strategie eines Gegners ist), die eine Liste von Ganzzahllisten liefert - von denen jede eine Gewinnstrategie ist (also eine leere Liste, wenn keine möglich ist).
(Fügen Sie einfach hinzu,
Ḣ
um nur eine einzige Strategieliste zu erhalten, oder0
wenn dies unmöglich ist.)Probieren Sie es online! (die Fußzeilenformate, um die Listen immer anzuzeigen)
Oder probieren Sie eine buchstabierte Version aus (bei der Strategien genommen und in eigener
RPSVL
Notation angezeigt werden ).Wie?
Die Zahlen werden so gewählt, dass alle Zahlen, die ungerade größer als ein anderes Modulo Five sind, gewinnen (dh sie werden um den Rand eines eingeschriebenen Fünfecks der Würfe herum nummeriert).
Der Code spielt jede Strategie gegen jede Strategie (einschließlich sich selbst) für doppelt so viele Würfe wie die längste Strategie aus, um sicherzustellen, dass Verlierer gefunden werden, die diejenigen behalten, die nicht besiegt werden. Die resultierende Liste von Strategien enthält eine einzelne Strategie, wenn es einen direkten Gewinner gibt. keine Strategien, wenn es keinen Gewinner gibt; oder mehrere Strategien, wenn es Zeichnungsspieler gibt. Danach wird jeder dieser Strategien eine Reihe von Gewinnzügen beigefügt.
quelle
ZLḤ
durchLÄ
.Ɗ
tut es aufgrund der Aktion in Ihrem Code nicht einmal das, was Sie vielleicht gedacht haben - es formt jedes wie seine eigene Länge und erhält dann die kumulativen Summen dieser Ergebnisse, so dass es auch falsche Werte vergleicht. Versuchen Sie dies zum Beispiel - es dauert[[1,2,3,4,5],[6,7],[8]]
, Formen jeweils nach der Länge der gesamten Liste (3) zu erhalten,[[1,2,3],[6,7,6],[8,8,8]]
und führt dann eine Akkumulation durch, um[[1,1+2,1+2+3],[6,6+7,6+7+8],[8,8+8,8+8+8]]
= zu erhalten[[1,3,6],[6,13,19],[8,16,24]]
.JavaScript (ES6),
122 115112 ByteNimmt Eingaben als Array von Ziffernfolgen auf, mit:
Probieren Sie es online!
Wie?
Dies ist eine Breitensuche: Wir versuchen zuerst alle Züge in einem bestimmten Schritt, um zu sehen, ob wir das Spiel gewinnen können. Wenn wir jetzt nicht gewinnen können, versuchen wir, jedem nicht verlierenden Zug einen weiteren Zug hinzuzufügen.
wo
and
undxor
sind bitweise Operatoren.Kommentiert
quelle
test(['P','P','S','P','P'])
Die Antwort sollte "SR" oder "SV" sein.R ,
213.190Bytes-23 Bytes dank Giuseppe.
Probieren Sie es online!
Wenn eine Lösung vorhanden ist, wird eine ausgegeben. Wenn es keine Lösung gibt, wird eine Reihe von ausgegeben
NA
. Wenn dieses Ausgabeformat nicht akzeptabel ist, kann ich es auf Kosten einiger Bytes ändern.Bewegungen werden als 1 = R, 2 = S, 3 = P, 4 = L, 5 = V codiert, so dass die Matrix der Ergebnisse lautet
(0 = kein Gewinner; 1 = Spieler 1 gewinnt; 2 = Spieler 2 gewinnt)
Eine Obergrenze für die Länge der Lösung, falls vorhanden, ist,
n=sum(lengths(L))
woL
sich die Liste der Züge des Gegners befindet. Der Code erstellt alle möglichen Längenstrategienn
(in Matrix gespeichert)v
), probiert sie alle aus und zeigt alle Gewinnstrategien an.Beachten Sie, dass dieser Wert von
n
den Code auf TIO sehr langsam macht, so dass ich den TIO fest codiert habe,n=4
was für die Testfälle ausreicht.Für den ersten Testfall ist die Ausgabe
entsprechend der Lösung RLSL.
Für den zweiten Testfall ist die Ausgabe
was bedeutet, dass es keine Lösung gibt.
Erklärung einer früheren Version (wird aktualisiert, wenn ich kann):
Das
which
ist notwendig, um NAs loszuwerden, die auftreten, wenn die beiden Spieler für immer ziehen.Ich bin nicht davon überzeugt, dass dies die effizienteste Strategie ist. Selbst wenn es so ist, bin ich sicher, dass der Code für
m
einiges golfen werden könnte.quelle
lengths()
Alias immer zurückzukehren4
?v
...lengths
,n=4
TIO zu erzwingen , weil es sonst zu lange dauert, alles durchzugehenEmacs Lisp, 730 Bytes
Ich habe keinen Online-Interpreter für Emacs Lisp gefunden :( Wenn Sie Emacs installiert haben, können Sie Code in ein kopieren
.el
Datei kopieren und einige der folgenden Testzeilen kopierenund lass es laufen
$ emacs --script filename.el
.Wie es funktioniert
Mein Programm führt zuerst eine Tiefensuche durch, wobei es manchmal herausfindet, dass es unmöglich ist, den Zweig zu gewinnen und zu beenden, in dem es sich befindet.
Sie können die vollständige Erklärung in der ungekürzten Version des Codes sehen:
quelle