Rock, Polyglot, Schere

68

Schreiben Sie ein Programm, das in drei Sprachen vielsprachig ist und Rock-Paper-Scissors spielt .

Die Eingabe für eine beliebige Programmversion ist immer eine der Zeichenfolgen rockoder paperoder scissors.

In der ersten Sprache muss das Programm die Stein-Papier-Scheren-Auswahl ausgeben, die die Eingabe schlägt:

Input     Output
rock      paper
paper     scissors
scissors  rock

In der zweiten Sprache muss das Programm die Stein-Papier-Scheren-Auswahl ausgeben, die die Eingabe bindet:

Input     Output
rock      rock
paper     paper
scissors  scissors

In der dritten Sprache muss das Programm die Stein-Papier-Scheren-Auswahl ausgeben, die bei der Eingabe verloren geht:

Input     Output
rock      scissors
paper     rock
scissors  paper

Der kürzeste Code in Bytes gewinnt. Tiebreaker ist höher gestimmte Antwort.

Die Eingänge und / oder Ausgänge können optional einen nachlauf Neue - Zeile haben , aber ansonsten nur sollten die Ebene sein rock/ paper/ scissorsSaiten. Sie Versalien verwenden können ROCK, PAPER, SCISSORSfalls gewünscht.

Sie dürfen nicht verschiedene Versionen derselben Sprache verwenden (z. B. Python 2 und 3).

Calvins Hobbys
quelle
Kann ein Sprachfehler herauskommen?
Kritixi Lithos
2
@KritixiLithos Gehen Sie mit dem Metakonzensus . "Ich denke, das Beenden mit einem Fehler oder einer nicht erfassten Ausnahme ist in Ordnung, solange es keine Streuausgabe an STDOUT erzeugt."
Calvins Hobbys
2
Können die verschiedenen Sprachen bei mehrsprachigen Texten Eingaben auf unterschiedliche Weise verarbeiten?
Jonathan Allan
3
@ JonathanAllan Das ist in Ordnung. Für einige Sprachgruppen, die nur bestimmte Eingabeformen haben, wäre dies erforderlich.
Calvins Hobbys
Was ist mit Lizard passiert, Spock? bigbangtheory.wikia.com/wiki/Rock_Paper_Scissors_Lizard_Spock
Ole Tange

Antworten:

60

Python, Brainfuck und JavaScript, 103 99 Bytes Ja, unter 100 Bytes!

0,[.5,];p=["rock","scissors","paper"]
1//1;lambda x:p[p.index(x)-1];"""
x=>p[-~p.indexOf(x)%3]//"""

In Python definiert dies eine Funktion, die die Eingabe schlägt, in Brainfuck ist es nur ein einfaches Katzenprogramm und in JavaScript verliert es. Hier ist eine Version, die den Funktionen einen Namen gibt fund außerdem zur Eingabe in JavaScript und Python 3 auffordert:

0,[.5,];p=["rock","scissors","paper"]
1//1;f=lambda x:p[p.index(x)-1];"""
f=x=>p[-~p.indexOf(x)%3]//"""

1//1;"""
console.log(f(prompt())) // JavaScript
1//1"""; print(f(input())) # Python

Probieren Sie es online aus (ältere Version): Python , Brainfuck , JavaScript

Erläuterung:

In Python """..."""ist dies eine mehrzeilige Zeichenfolge, die als beliebiges Token verwendet werden kann. Im Standalone-Modus macht es überhaupt nichts. Ich benutze dies, um den JavaScript-Code von Python "auszublenden". Das Gleiche gilt für das (0,[.5,])Bit, es ist nur ein Tupel mit a 0und einer Liste von 5, und auch der 1//1Teil //in Python ist eine Ganzzahldivision, startet jedoch einen Kommentar in JavaScript. Hier ist der Code, der von diesen Token befreit ist:

p=["rock","scissors","paper"]
lambda x:p[p.index(x)-1]

Die erste Zeile ist ziemlich selbsterklärend, sie definiert lediglich die Liste, pin der die verschiedenen Auswahlmöglichkeiten für Stein-Papier-Scheren enthalten sind. Die zweite Zeile definiert eine unbenannte Funktion, die ein Argument aufnimmt xund die Auswahl zurückgibt, die schlägt x(z. B. das vorherige Element in p).


//Bezeichnet in JavaScript einen einzeiligen Kommentar. Ähnlich wie bei Python werden einzelne Token ignoriert, sodass der Code, der von diesen Token befreit wird, wie folgt lautet:

p=["rock","scissors","paper"]
x=>p[-~p.indexOf(x)%3]

Dies funktioniert ähnlich wie in Python, indem zuerst die Liste so eingestellt wird p, dass sie die Auswahl enthält, und dann eine anonyme Funktion definiert wird, die die verlierende Auswahl ermöglicht. -~xist das selbe wie x+1aber mit höherer Priorität damit ich die parens überspringen kann.


In Brainfuck werden alle Zeichen mit Ausnahme der folgenden +-,.[]<>entfernt:

,[.,][,,]
[.-]
>[-.]

Der Befehl ,liest ein Byte der Eingabe, .druckt es und [...]durchläuft eine Schleife, während der Wert ungleich Null ist. Dieses Programm liest dann die Eingabe und druckt sie zeichenweise aus, bis das Zeichen \0gefunden wird. Da wir das nicht im Code haben, können wir den Rest des Programms ignorieren. In der Tat spiegelt dies nur das wider, was der Benutzer eingibt, und bindet sie effektiv.

Loovjo
quelle
Ich habe an einer sehr ähnlichen Lösung gearbeitet, aber du hast mich geschlagen :). Sie müssen den Javascript TIO-Link übrigens aktualisieren, er unterscheidet sich von den beiden anderen.
DimP
2
x=>p[p.indexOf(x)+1]||"rock"//"""könnte verkürzt werden aufx=>p[(p.indexOf(x)+1)%3]//"""
Luke
13
+1 Ich habe noch nie gesehen, dass Brainfuck so gut versteckt ist. Normalerweise ist es offensichtlich, dass ein Polyglot auch BF enthält. Nicht in diesem!
vsz
Ich denke, Sie können das BF-Programm ein wenig verschieben, um ein oder zwei Bytes zu sparen:1//1,[.5,];
ETHproductions
Tatsächlich denke ich, dass Sie das Vorhandene []in der zweiten Zeile verwenden können, um mehr Bytes zu sparen:1//1,;lambda x:p[p.index(x,0)+-1];"""
ETHproductions
40

Python 2, Ruby, Retina, 90 83 Bytes

-7 Bytes dank Value Ink

s=['rock','paper','scissors']
print s[s.index((0and gets or input()))+(0and-2or-1)]

Probieren Sie es online aus: Python , Ruby , Retina

Gewinnt in Ruby, verliert in Python und bindet in Retina. Diese Lösung nutzt die Tatsache, dass0 in Ruby wahr, in Python aber falsch ist. Es nutzt auch die negative Indizierung in Python und Ruby.

Mathe-Junkie
quelle
andHat Vorrang vor dem Operator or, s.index(0and STDIN.gets or input())funktioniert also. Ist auch getsein Alias ​​für STDIN.getsin Ruby.
Value Ink
10
+1 nicht nur für das Auskommentieren von Code auf verschiedene Arten!
Leo
@ ValueInk Vielen Dank! Ich dachte, es
Math Junkie
21

V, Brain-Flak und Python 2, 97, 86, 81, 77 , 75 Bytes

o='rock paper scissors'.split()
lambda s:o[o.index(s)-1]#ddt.C rHd*wywVp

Zwei Bytes gespart dank @ nmjcman101!

Das hat super Spaß gemacht! Diese Antwort gefällt mir sehr, weil sie einen coolen Überblick über die Sprachen bietet, die ich mag: Mein Lieblingseditor, meine nicht-esoterische Lieblingssprache und eine Sprache, die ich geschrieben habe. (Technisch gesehen ist Python 3 besser, aber Python 2 ist Golfspieler¯\_(ツ)_/¯ ).

Probieren Sie es online!in Python (leicht modifiziert, damit Sie die Ausgabe sehen können), wodurch gedruckt wird, was an der Eingabe verloren geht.

Probieren Sie es online!in Brain-Flak, das druckt, was mit der Eingabe zusammenhängt.

Probieren Sie es online!In V wird gedruckt, was die Eingabe schlägt.

Da sich V auf nicht druckbare ASCII-Zeichen stützt, ist hier ein Hexdump:

00000000: 6f3d 2772 6f63 6b20 7061 7065 7220 7363  o='rock paper sc
00000010: 6973 736f 7273 272e 7370 6c69 7428 290a  issors'.split().
00000020: 6c61 6d62 6461 2073 3a6f 5b6f 2e69 6e64  lambda s:o[o.ind
00000030: 6578 2873 292d 315d 231b 6464 742e 4320  ex(s)-1]#.ddt.C 
00000040: 720e 1b48 642a 7779 7756 70              r..Hd*wywVp

Erläuterung:

Python

In Python ist dies sehr einfach. Wir definieren eine Liste der drei Elemente und geben das Element direkt vor der Eingabe zurück. Da -1das Element back zurückgegeben wird, funktioniert dies kreisförmig und alles ist sehr einfach und unkompliziert. Dann ist alles nach #ein Kommentar.

Brain-Flak

Dies ist auch bei Brain Flak äußerst einfach. Wenn wir gewinnen oder verlieren müssten, wären dies wahrscheinlich mehrere hundert Bytes. Dies funktioniert aber tatsächlich in 0 Bytes. Beim Programmstart wird die gesamte Eingabe in den Stapel geladen. Am Ende des Programms wird implizit der gesamte Stapel gedruckt.

Sobald wir alle irrelevanten Zeichen entfernt haben, sieht der Code Brain-Flak so aus

()[()]

Das 1 + -1ergibt einfach , aber da dieser Wert überhaupt nicht verwendet wird, ist es ein NOOP.

V

Hier wird es etwas komisch. Das Benennen der Python-Liste oschien zwar willkürlich, ist es aber definitiv nicht. oÖffnet in V eine neue Zeile und versetzt uns in den Einfügemodus. Dann,

='rock paper scissors'.split()
lambda s:o[o.index(s)-1]#

wird in den Puffer eingefügt. Danach lautet der relevante Code:

<esc>ddxxf'C r<C-n><esc>Hd*wywVp

Erläuterung:

<esc>                          " Return to normal mode
     dd                        " Delete this line. Now the cursor is on '='
       t.                      " Move the cursor forward to the "'"
         C                     " Delete everything after the "'", and enter insert mode
           r                   " From insert mode, enter '<space>r'
            <C-n>              " Autocomplete the current word based on what is currently in the buffer
                               " Since only one word starts with 'r', this will insert 'rock'
                 <esc>         " Leave back to normal mode
                      H        " Go to the first line (where the input is)
                       d*      " Delete everything up until the next occurence of the input
                         w     " Move forward one word
                          yw   " Yank the word under the cursor
                            Vp " And paste that word over the current line, delete everything else
DJMcMayhem
quelle
@ WheatWizard In Python gibt es keinen Grund, nicht zu (außer, dass es die gleiche Länge hat). Aber es ruiniert alles in V.
DJMcMayhem
@ WheatWizard Ursache V ist eine wirklich seltsame Sprache, und dies ist eine wirklich seltsame Aufgabe für sie. Alles .split()hängt stark vom Layout der Zeichen ab und ist leichter zu entfernen als die verschiedenen Klammern und Anführungszeichen, die in Ihrer Lösung angezeigt werden.
DJMcMayhem
Super moll, aber du kannst das rausnehmen xxund durch ein ersetzen 2, um den Befehl zu machen, 2f'da der sowieso ='von dem d*späteren gelöscht wird . EDIT: könntest du es schaffen t.?
nmjcman101
@ nmjcman101 Oooh, süße, tolle Idee. Danke für den Tipp!
DJMcMayhem
16

CJam , Retina , PHP, 92 86 85 Bytes

ECHO["rock",0,"scissors","paper"][ORD(READLINE())%4];
#];"scissors  paper rock"S/rci=

Sollte in PHP mit dem -rFlag ausgeführt werden.

Probieren Sie es in CJam

Probieren Sie es in Retina

Probieren Sie es in PHP

CJam

In CJam sind alle Großbuchstaben vordefinierte Variablen. In der ersten Zeile werden viele dieser Werte zusammen mit einigen String- und Array-Literalen auf den Stapel geschrieben. Einige Inkremente, Dekremente und andere Operationen werden ausgeführt.

Nach alledem wird der Stapel in ein Array ( ]) eingeschlossen und verworfen ( ;), sodass nichts von all dem anderen wichtig ist. Das Hauptprogramm von CJam ist einfach:

"scissors  paper rock"S/rci=

"scissors  paper rock"        e# Push this string
                      S/      e# Split it on spaces
                        r     e# Read the input
                         c    e# Cast to char (returns the first character in the string)
                          i   e# Cast to int (its codepoint)
                           =  e# Get the index of the split array (CJam has modular arrays)

Retina

Das fühlt sich fast wie Schummeln an ...

Retina ersetzt jede Übereinstimmung des regulären Ausdrucks ECHO["rock",0,"scissors","paper"][ORD(READLINE())%4];in der Eingabe durch #];"scissors paper rock"S/rci=. Was auch immer diese Regex übereinstimmt, sicherlich ist es nicht etwas in passen rock, paperoder scissors, so dass keine Substitution vorgenommen wird. Die unveränderte Eingabe wird dann implizit ausgegeben.

PHP

Die zweite Zeile ist ein Kommentar und wird ignoriert.

Die erste Zeile verwendet denselben Algorithmus wie der CJam-Teil, jedoch mit unterschiedlicher Reihenfolge der Ergebnisse.

Geschäfts-Katze
quelle
1
TIL PHP-Funktionen berücksichtigen die Groß- und Kleinschreibung nicht.
Gcampbell
14

C, C ++, Python; 227 226 216 Bytes

Dank @Mat ein Byte gespeichert!

#include<stdio.h>/*
f=lambda a:"rock"if a[0]=="r"else"paper"if a[0]=="p"else"scissors"
"""*/
int f(char*b){puts(sizeof'b'-1?*b=='r'?"paper":*b=='s'?"rock":"scissors":*b=='r'?"scissors":*b=='s'?"paper":"rock");}
//"""

Definiert eine Funktion fin allen Sprachen. Siege in C, Unentschieden in Python, Verluste in C ++. Wie C ++ immer / s

Der Teil zwischen dem /*und dem */ist ein Kommentarblock in C und C ++, während es sich um die Lambda-Funktionsdeklaration in Python handelt. Es vergleicht im Grunde das erste Zeichen des Funktionsarguments und gibt den Zug zurück, der mit diesem Buchstaben beginnt.

Der Teil zwischen dem """s ist eine mehrzeilige Zeichenfolge in Python, während es sich um die Funktionsdeklaration in C und C ++ handelt. sizeof'b'-1stellt fest, ob die aktuelle Sprache C von C ++ ist. Es hat einen Wahrheitswert, wenn die Größe nicht 1 ist, andernfalls einen falschen Wert. In C sind Zeichenliterale vom Typ 4 Byte lang, während sie in C ++ vom Typ 1 Byte sind. Nachdem die Sprache herausgefunden wurde, wird nur der erste Buchstabe der Eingabe angezeigt und entsprechend ausgegeben.

C

Probieren Sie es online!

C ++

Probieren Sie es online!

Python

Probieren Sie es online!

betseg
quelle
4
"Der Teil zwischen den" "s ist ein Kommentarblock in Python" "Es ist eigentlich eine mehrzeilige Zeichenfolge.
ivzem
10

C ++, R, C; 252 240 226 220 209 Bytes

#define b/*
M=function()cat(readline())
#*/
#import<stdio.h>
#define M()main(){int i=0;char t[9];char*u;char*s[]={"rock","paper","scissors"};scanf("%s",t);for(;*t-*s[i++];);puts(s[(i+=sizeof('a')==1)%3]);}
M()

Nutzt den Unterschied zwischen C und C ++, dass die Größe eines Zeichenliteral 4 Byte in C und 1 Byte in C ++ beträgt.

C ++:

Probieren Sie es online!

R:

Ergebnis:

> #define b/*
> M=function()cat(readline())
> #*/
> #import<stdio.h>
> #define M()main(){int i=0;char t[9];char*u;char*s[]={"rock","paper","scissors"};scanf("%s",t);for(;*t-*s[i++];);puts(s[(i+=sizeof('a')==1)%3]);}
> M()
rock
rock

C:

Probieren Sie es online!

Steadybox
quelle
8

Gawk, Retina, Perl; 68 Bytes

{eval"\$_=uc<>"}{$_=/[Sk]/?"paper":/[Pc]/?"rock":"scissors"}{print}

(mit einem Zeilenumbruch am Ende)

Gawk (Gewinner)

Einige Junk-Mails für Perl. Ändern Sie dann den Zeileninhalt ( $_der derselbe ist, $0weil die Variable _undefiniert ist), je nachdem, ob a koder a enthalten ist c, und drucken Sie dann das Ergebnis aus. Ignoriere jede Warnung über Fluchtsequenzen, ich wollte das tun.

{a_string_that_is_ignored}
{$_ = /[Sk]/ ? "paper" : /[Pc]/ ? "rock" : "scissors"}
{print}

Netzhaut (Krawatte)

Gleicher Trick wie bei Basic Sunset und anderen: Ersetzen Sie Übereinstimmungen einiger alberner regulärer Ausdrücke in der ersten Zeile durch den Inhalt der zweiten Zeile, und leiten Sie die Eingabe weiter.

Perl (Verlierer)

Lesen Sie eine Zeile und konvertieren Sie sie in Großbuchstaben. Wählen Sie dann ein Wort aus, das auf einem darin enthaltenen Buchstaben basiert, und drucken Sie das Ergebnis aus. Der erste und letzte Schritt werden mit umhüllt eval, um sie vor awk zu verbergen.

$_ = uc <>;
$_ = /[Sk]/ ? "paper" : /[Pc]/ ? "rock" : "scissors";
print $_

Gawk, Retina perl -p; 57 Bytes

Ich gebe dies als Bonus ein, da die Befehlszeilenumschaltung perl -pnach den üblichen Regeln auf dieser Site Teil des Programms sein soll, was es nicht zu einer Mehrsprachigkeit machen würde.

{eval"\$_=uc"}$_=/[Sk]/?"paper":/[Pc]/?"rock":"scissors"

Wieder mit einem letzten Zeilenvorschub für Retina . Diesmal wird durch perl -pdas automatische Drucken der Ausgabe der Perl-Overhead erheblich reduziert. Ich kann die Anweisung$_ in awk einen impliziten Druck auslösen lassen .

Gilles
quelle
Könnten Sie vielleicht einen TIO-Link (oder einen ähnlichen Online-Compiler zum Testen) für jeden von ihnen hinzufügen ?
Kevin Cruijssen
@ KevinCruijssen Hinzugefügt. Die Ausgabe auf TIO für perl -pist leer, es muss sich um einen Fehler auf TIO handeln.
Gilles
7

> <>, Retina, Python 2: 144 127 123 Bytes

1 Byte wurde dank @Loovjo durch Entfernen eines Leerzeichens eingespart

4 Bytes gespart dank @ mbomb007 durch Verwendung von inputanstelle vonraw_input

#v"PAPER"v?%4-2{"SCISSORS"v?%2:i
#>ooooo; >oooooooo<"ROCK"~<
a="KRS".index(input()[-1])
print["SCISSORS","ROCK","PAPER"][a]

Als Herausforderung in TNB veröffentlicht , habe ich mich entschlossen, diese Sprachkombination auszuprobieren.

> <>

Probieren Sie es online!

Die IP beginnt sich nach rechts zu bewegen.

#                      Reflect the IP so that it now moves left and it wraps around the grid
i:                     Take one character as input and duplicate it

Die möglichen Zeichen, die in die Eingabe übernommen werden, sind PRS(da das Programm nur das erste Zeichen akzeptiert). Ihre ASCII-Werte sind 80, 81und 82.

2%                     Take the modulo 2 of the character. Yields 0, 1, 0 for P, R, S respectively
?v                     If this value is non-zero (ie the input was ROCK), go down, otherwise skip this instruction

Wenn der Input Rock wäre, dann würde folgendes passieren:

<                      Start moving to the left
~                      Pop the top most value on the stack (which is the original value of R and not the duplicate)
"KCOR"                 Push these characters onto the stack
<                      Move left
oooo                   Output "ROCK" as characters (in turn these characters are popped)
o                      Pop the top value on the stack and output it; but since the stack is empty, the program errors out and exits promptly.

Andernfalls, wenn die Eingabe SCISSORSoder wäre PAPER, würde die IP auf Folgendes stoßen:

"SROSSICS"             Push these characters onto the stack
{                      Shift the stack, so the the original value of the first char of the input would come to the top
2-4%                   Subtract 2 and take modulo 4 of the ASCII-value (yields 2, 0 for P, S respectively)
?v                     If it is non-zero, go down, otherwise skip this instruction

Wenn die Eingabe war PAPER, dann:

>ooooooooo             Output all characters on the stack (ie "SCISSORS")
<                      Start moving left
o                      Pop a value on the stack and output it; since the stack is empty, this gives an error and the program exits.

Ansonsten (wenn die Eingabe war SCISSORS):

"REPAP"                Push these characters onto the stack
v>ooooo;               Output them and exit the program (without any errors).

Retina

Probieren Sie es online!

In diesem Fall betrachtet Retina jedes Paar von zwei Zeilen als ein Paar von Übereinstimmung und Ersetzung. Beispielsweise wird versucht, alles, was mit der ersten Zeile übereinstimmt, durch die zweite Zeile zu ersetzen. Da jedoch die erste Zeile niemals übereinstimmt, wird sie niemals durch etwas ersetzt, wodurch die Eingabe erhalten bleibt.

Python 2

Probieren Sie es online!

Das Python-Programm erfordert Eingaben zwischen "s.

Die ersten beiden Zeilen sind Kommentare in Python.

a="KRS".index(input()[-1])             # Get the index of the last character of the input in "KRS"
print["SCISSORS","ROCK","PAPER"][a]    # Print the ath index of that array
Kritixi Lithos
quelle
Ich denke nicht, dass das Leerzeichen nach printder letzten Zeile notwendig ist.
Loovjo
Sie können input()anstelle von verwenden raw_input().
mbomb007
@ Loovjo Danke für den Tipp :)
Kritixi Lithos
@ mbomb007 Das scheint nicht zu funktionieren
Kritixi Lithos
@KritixiLithos es funktioniert, wenn der Python-Teil mit Anführungszeichen eingibt
undergroundmonorail
0

Ruby, Clojure, Common Lisp - 251 Bytes

(print(eval '(if()({(quote SCISSORS)(quote PAPER)(quote PAPER)(quote ROCK)(quote ROCK)(quote SCISSORS)}(read))(eval(quote(nth(position(read)(quote("SCISSORS""PAPER""ROCK")):test(quote string-equal))(quote(ROCK SCISSORS PAPER))))))))
;'['"'+gets+'"']))

Mehr lesbare Version mit Leerzeichen:

(print(eval '(if() ; distinguish between CLojure and Common Lisp
    ({(quote SCISSORS)(quote PAPER)(quote PAPER)
       (quote ROCK)(quote ROCK)(quote SCISSORS)}(read)) ; use hash-map as a function
    (eval(quote(nth ; find index of the input arg in the list
       (position(read)(quote("SCISSORS""PAPER""ROCK")):test(quote string-equal))  
    (quote(ROCK SCISSORS PAPER))))))))
 ;'['"'+gets+'"'])) ; ruby indexation

Clojure gewinnt immer, Ruby zieht immer, Common Lisp verliert immer.

Für Ruby ist alles in 's ein String. Es erstreckt sich über zwei Linien. Anschließend wird der []Operator mit einem Zeichenfolgenargument verwendet, das die Zeichenfolge selbst zurückgibt, wenn sie in der Zeichenfolge vorhanden ist. Das Ergebnis wird ausgedruckt, Ruby spiegelt nur die Eingabe.

Die zweite Zeile ist ein Kommentar für Clojure und Common Lisp. Eine Reihe von evalund quotemuss verwendet werden, da Clojure sicherstellen muss, dass alle Symbole gültig sind. Es wäre schön, mehr Code wiederzuverwenden, aber selbst nthFunktionen haben in diesen Sprachen unterschiedliche Signaturen. Grundsätzlich wird Clojure if()mit true ausgewertet und geht zum ersten Zweig, wenn eine Hash-Map möglicher Varianten mit einem aus stdin gelesenen Argument aufgerufen wird. Common Lisp geht zum zweiten Zweig, findet die Position des Arguments von stdin in der Liste und gibt das entsprechende Element aus der resultierenden Liste zurück.

Ich denke, Common Lisp kann mehr gespielt werden.

Sehen Sie es online: Ruby , Common Lisp , Clojure

Cliffroot
quelle
0

Scala, Javascript und Ook, 167 Bytes

s=>{var a="paper,scissors,rock".split(",")/*/**/a[-1]="rock"
return a[a.indexOf(s)-1];`*/a((a.indexOf(s)+1)%3)//`//Ook. Ook. Ook! Ook? Ook. Ook! Ook! Ook. Ook? Ook!
}

Probieren Sie es in Scala aus Probieren Sie es in Javascript aus Probieren Sie die Brainfuck-Version von Ook aus

Scala - gewinnt

s=>{                                                      //define an anonymous function
  var a="paper,scissors,rock".split(",")                  //generate the array
  /* /* */ a[-1]="rock"                                   //scala supports nested comments,
  return a[a.indexOf(s)-1];`                              //so this comment...
  */                                                      //...ends here
  a((a.indexOf(s)+1)%3)                                   //return the winning string
  //`//Ook. Ook. Ook! Ook? Ook. Ook! Ook! Ook. Ook? Ook!  //another comment
}

Javascript - verliert

s=>{                                                   //define an anonymous function
  var a="paper,scissors,rock".split(",")               //generate the array
  /*/**/                                               //a comment
  a[-1]="rock"                                         //put "rock" at index -1
  return a[a.indexOf(s)-1];                            //return the string that loses
  `*/a((a.indexOf(s)+1)%3)//`                          //a string
  //Ook. Ook. Ook! Ook? Ook. Ook! Ook! Ook. Ook? Ook!  //a comment
}

Ook! - Bindungen

Der Ook-Teil ist das einfache Brainfuck-Katzenprogramm, ,[.,]das nach Ook übersetzt wurde.

s=>{var a="paper,scissors,rock".split(",")/*/**/a[-1]="rock"   //random stuff
return a[a.indexOf(s)-1];`*/a((a.indexOf(s)+1)%3)//`//         //more random stuff
Ook. Ook. Ook! Ook? Ook. Ook! Ook! Ook. Ook? Ook!              //the program
}                                                              //random stuff
corvus_192
quelle
Wenn Sie a[(a.indexOf(s)+2)%3]dann verwenden, müssen Sie nicht einstellen a[-1]="rock". Können Sie den Ook-Code auch nicht in die JavaScript-Zeichenfolge einfügen?
Neil