Skała, Polyglot, Nożyczki

68

Napisz program, który jest poliglotą w trzech językach, który odtwarza kamień-papier-nożyce .

Wejście dla dowolnej wersji programu jest zawsze jeden z ciągów rocklub paperlub scissors.

W pierwszym języku program musi wypisać wybór papieru-kamienia-nożyczek, który przewyższa dane wejściowe:

Input     Output
rock      paper
paper     scissors
scissors  rock

W drugim języku program musi wypisać wybór papieru-kamienia-nożyczek, który wiąże dane wejściowe:

Input     Output
rock      rock
paper     paper
scissors  scissors

W trzecim języku program musi wypisać wybór papieru z kamienia, który traci na danych wejściowych:

Input     Output
rock      scissors
paper     rock
scissors  paper

Najkrótszy kod w bajtach wygrywa. Tiebreaker to głosowana odpowiedź.

Wejścia i / lub wyjścia mogą opcjonalnie mieć końcowy znak nowej linii, ale w przeciwnym razie powinny być tylko zwykłe rock/ paper/ scissorsłańcuchy. Można używać wielkich liter ROCK, PAPER, SCISSORSjeśli jest to pożądane.

Być może nie korzystać z różnych wersji tego samego języka (np Python 2 i 3).

Hobby Calvina
źródło
Czy błąd języka może wyjść, aby wyjść?
Kritixi Lithos
2
@KritixiLithos Go with the meta concensus . „Myślę, że kończenie z błędem lub niewyłapanym wyjątkiem jest w tym przypadku w porządku, pod warunkiem, że nie generuje zbędnych danych wyjściowych do STDOUT”.
Calvin's Hobbies
2
Nigdy nie jestem pewien z poliglotami, czy różne języki mogą przyjmować dane na różne sposoby?
Jonathan Allan
3
@JonathanAllan W porządku. W przypadku niektórych zestawów językowych, które mają tylko określone formy wprowadzania danych, byłoby to konieczne.
Calvin's Hobbies
Co się stało z Jaszczurką, Spock? bigbangtheory.wikia.com/wiki/Rock_Paper_Scissors_Lizard_Spock
Ole Tange

Odpowiedzi:

60

Python, pieprzony mózg i JavaScript, 103 99 bajtów Yay poniżej 100 bajtów!

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

W Pythonie definiuje to funkcję, która bije dane wejściowe, w pieprzeniu mózgu jest to po prostu prosty program dla kotów, aw JavaScript przegrywa. Oto wersja, która nadaje funkcjom nazwę f, a także monituje o wprowadzenie danych w JavaScript i Python 3:

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

Wypróbuj online (starsza wersja): Python , brainfuck , JavaScript

Wyjaśnienie:

W Pythonie """..."""jest ciągiem wielowierszowym, którego można używać jako dowolnego tokena. Umieszczony jako samodzielny nie robi nic. Używam tego do „ukrywania” kodu JavaScript przed Pythonem. To samo tyczy się (0,[.5,])nieco, to tylko krotka zawierająca 0i listę 5, a także 1//1część, //w Pythonie jest dzieleniem całkowitym, ale rozpoczyna komentarz w JavaScript. Oto kod pozbawiony tych tokenów:

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

Pierwszy wiersz jest dość oczywisty, po prostu definiuje listę, paby zawierała różne wybory w papierach-kamieniu-nożyczkach. Druga linia definiuje nienazwaną funkcję, która przyjmuje jeden argument xi zwraca wybór, który bije x(np. Poprzedni element w p)


W JavaScript //oznacza komentarz jednowierszowy. Podobnie jak w Pythonie pojedyncze tokeny są ignorowane, więc ich kod jest pozbawiony:

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

Działa to podobnie do Pythona, najpierw ustawiając listę, paby zawierała opcje, a następnie definiując anonimową funkcję, która daje przegrany wybór. -~xjest taki sam, x+1ale z wyższym priorytetem, abym mógł pominąć pareny.


W pieprzeniu mózgu wszystkie postacie oprócz +-,.[]<>są usuwane, pozostawiając to:

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

Polecenie ,odczytuje jeden bajt danych wejściowych, .drukuje je i [...]zapętla, gdy wartość jest różna od zera. Następnie program odczytuje dane wejściowe i drukuje je po jednym znaku, aż znak \0zostanie znaleziony. Ponieważ nie mamy tego w kodzie, możemy zignorować resztę programu. W efekcie powoduje to tylko echo tego, co wpisze użytkownik, skutecznie je wiążąc.

Loovjo
źródło
Pracowałem nad bardzo podobnym rozwiązaniem, ale mnie do tego pobiłeś :). Musisz zaktualizować link JavaScript TIO btw, różni się on od pozostałych dwóch.
DimP
2
x=>p[p.indexOf(x)+1]||"rock"//"""można skrócić dox=>p[(p.indexOf(x)+1)%3]//"""
Łukasz
13
+1 Nigdy nie widziałem, żeby Brainfuck był tak dobrze ukryty. Zwykle jest oczywiste, czy poliglot zawiera również BF. Nie w tym!
vsz
Myślę, że możesz trochę przesunąć program BF, aby zaoszczędzić bajt lub dwa:1//1,[.5,];
ETHprodukcje
W rzeczywistości myślę, że można użyć istniejącej []w drugiej linii, aby zaoszczędzić więcej bajtów:1//1,;lambda x:p[p.index(x,0)+-1];"""
ETHproductions
40

Python 2, Ruby, Retina, 90 83 bajtów

-7 bajtów dzięki Value Ink

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

Wypróbuj online: Python , Ruby , Retina

Wygrywa w Ruby, przegrywa w Pythonie i wiąże w siatkówce. To rozwiązanie wykorzystuje fakt, który 0jest prawdziwy w Ruby, ale falsey w Pythonie. Wykorzystuje również indeksowanie ujemne zarówno w Pythonie, jak i Ruby.

ćpun matematyki
źródło
andma pierwszeństwo przed operatorem or, więc s.index(0and STDIN.gets or input())działa. Ponadto, getsjest aliasem STDIN.getsw Ruby.
Wartość tuszu
10
+1 za nie tylko komentowanie kodu na różne sposoby!
leo
@ValueInk Dziękujemy! Uznałem, że musi istnieć bardziej zwięzły sposób na zdobycie wkładu w Ruby, i okazuje się, że był
ćpun matematyki
21

V, Brain-flak i Python 2, 97, 86, 81, 77 , 75 bajtów

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

Dwa bajty zapisane dzięki @ nmjcman101!

To była super zabawa! Bardzo podoba mi się ta odpowiedź, ponieważ jest to fajny przegląd języków, które lubię: Mój ulubiony edytor, mój ulubiony nie-ezoteryczny język i język, który napisałem. (Technicznie python 3 jest lepszy, ale python 2 jest bardziej golfisty ¯\_(ツ)_/¯).

Wypróbuj online! w Pythonie (nieco zmodyfikowany, aby można było zobaczyć wynik), który wypisuje to, co traci na wejściu.

Wypróbuj online! w Brain-Flak, która drukuje to, co wiąże się z danymi wejściowymi.

Wypróbuj online! w V, która wypisuje to, co bije wejście.

Ponieważ V opiera się na niedrukowalnych znakach ASCII, oto zrzut heksowy:

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

Wyjaśnienie:

Pyton

W Pythonie jest to bardzo proste. Definiujemy listę trzech elementów i zwracamy element tuż przed danymi wejściowymi. Ponieważ -1zwraca element tylny, działa to kołowo, a wszystko to jest bardzo proste i łatwe. Potem wszystko #jest komentarzem.

Brain-Flak

Jest to również niezwykle proste w przypadku uderzenia mózgu. Gdybyśmy musieli wygrać lub przegrać, prawdopodobnie byłoby to kilkaset bajtów. Ale tak naprawdę działa to w 0 bajtach. Na początku programu wszystkie dane wejściowe są ładowane na stos. Pod koniec programu cały stos jest drukowany domyślnie.

Po usunięciu wszystkich nieistotnych znaków kod „wiotczenia mózgu” jest następujący

()[()]

Które po prostu ocenia 1 + -1, ale ponieważ ta wartość w ogóle nie jest używana, jest to NOOP.

V.

Tutaj robi się trochę dziwnie. Nazewnictwo listy pytonów omogło wydawać się arbitralne, ale zdecydowanie nie jest. W V ootwiera nowy wiersz i wprowadza nas w tryb wstawiania. Następnie,

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

jest wstawiany do bufora. Następnie odpowiednim kodem jest:

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

Wyjaśnienie:

<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
źródło
@WheatWizard W Pythonie nie ma też żadnego powodu (poza tym, że ma taką samą długość). Ale wszystko psuje V.
DJMcMayhem
@WheatWizard Przyczyna V to naprawdę dziwny język i jest to dla niego naprawdę dziwne zadanie. Wszystko w dużej mierze zależy od układu znaków i .split()łatwiej jest pozbyć się różnych nawiasów i cytatów pojawiających się w twoim rozwiązaniu.
DJMcMayhem
Bardzo małe, ale możesz wyjąć xxi zastąpić je, 2aby wykonać polecenie, 2f'ponieważ i tak ='zostanie ono usunięte d*później. EDYCJA: możesz to zrobić t.?
nmjcman101 13.04.17
@ nmjcman101 Oooh, słodki, niesamowity pomysł. Dzięki za wskazówkę!
DJMcMayhem
16

CJam , Retina , PHP, 92 86 85 bajtów

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

Powinien być uruchamiany w PHP przy użyciu -rflagi.

Wypróbuj w CJam

Wypróbuj w Retina

Wypróbuj w PHP

CJam

W CJam wszystkie wielkie litery są predefiniowanymi zmiennymi. W pierwszym wierszu wiele z tych wartości jest wypychanych na stos wraz z literałami ciągów i tablic. Niektóre inkrementy, dekrementacje i inne operacje są wykonywane.

Po tym wszystkim stos jest zawijany w tablicę ( ]) i odrzucany ( ;), więc żadne z tych innych rzeczy w ogóle nie ma znaczenia. Główny program CJam to po prostu:

"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)

Siatkówka oka

To prawie jak oszustwo ...

Retina zastąpi dowolne dopasowanie wyrażenia regularnego ECHO["rock",0,"scissors","paper"][ORD(READLINE())%4];na wejściu #];"scissors paper rock"S/rci=. Cokolwiek pasuje ten regex, to na pewno nie pasuje do niczego rock, paperalbo scissors, więc nie podstawienie jest wykonany. Niezmodyfikowane dane wejściowe są następnie domyślnie wysyłane.

PHP

Drugi wiersz to komentarz, więc jest ignorowany.

Pierwszy wiersz używa tego samego algorytmu co część CJam, ale z inną kolejnością wyników.

Business Cat
źródło
1
Funkcje TIL PHP nie rozróżniają wielkości liter.
gcampbell
14

C, C ++, Python; 227 226 216 bajtów

Zapisano bajt dzięki @Mat!

#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");}
//"""

Definiuje funkcję fwe wszystkich językach. Wygrywa w C, więzi w Pythonie, przegrywa w C ++. Podobnie jak C ++ zawsze robi / s

Część pomiędzy /*i */to blok komentarza w C i C ++, podczas gdy jest to deklaracja funkcji lambda w Pythonie. Zasadniczo porównuje pierwszy znak argumentu funkcji i zwraca ruch rozpoczynający się od tej litery.

Część między """s jest ciągiem wielowierszowym w Pythonie, podczas gdy jest deklaracją funkcji zarówno w C, jak i C ++. sizeof'b'-1dowiedzieć się, czy bieżącym językiem jest C C ++. Ma prawdziwą wartość, jeśli rozmiar jest inny niż 1, w przeciwnym razie wartość fałsz. W literałach znakowych C litery są 4-bajtowe, natomiast w C ++ są jednobajtowe. Następnie, gdy język zostanie zorientowany, po prostu patrzy na pierwszą literę wejścia i wyjścia odpowiednio.

do

Wypróbuj online!

C ++

Wypróbuj online!

Pyton

Wypróbuj online!

betseg
źródło
4
„Część pomiędzy«»” s jest blok komentarz w Pythonie”To rzeczywiście multiline ciąg.
ivzem
10

C ++, R, C; 252 240 226 220 209 bajtów

#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()

Wykorzystuje różnicę między C i C ++, że wielkość literału znaku wynosi 4 bajty w C i 1 bajt w C ++.

C ++:

Wypróbuj online!

R:

Wynik:

> #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

DO:

Wypróbuj online!

Steadybox
źródło
8

Gawk, Retina, Perl; 68 bajtów

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

(z nową linią na końcu)

Gawk (zwycięzca)

Niektóre śmieci dla Perla, a następnie zmień zawartość wiersza ( $_który jest taki sam, $0ponieważ zmienna _jest niezdefiniowana) w zależności od tego, czy zawiera ka c, a następnie wydrukuj wynik. Zignoruj ​​wszelkie ostrzeżenia o sekwencjach ucieczki, chciałem to zrobić.

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

Retina (krawat)

Ta sama sztuczka, co Basic Sunset i inne: zamień dopasowania niektórych głupich wyrażeń regularnych w pierwszym wierszu na treść drugiego wiersza, więc przekaż dane wejściowe.

Perl (przegrany)

Przeczytaj wiersz i przekonwertuj go na wielkie litery, a następnie wybierz słowo na podstawie zawartej w nim litery i wydrukuj wynik. Pierwszy i ostatni krok są owijane za pomocą, evalaby ukryć je przed awk.

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

Gawk, Retina perl -p; 57 bajtów

Podaję to jako bonus, ponieważ przełącznik wiersza poleceń perl -ppowinien być częścią programu według zwykłych zasad na tej stronie, co sprawiłoby, że nie byłby to poliglot.

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

Znowu z nową linią dla Retina . Tym razem, perl -paby automatycznie wydrukować wydruk, obciążenie perla jest znacznie zmniejszone. Mogę pozwolić, aby zadanie $_uruchomiło ukryty wydruk w awk .

Gilles
źródło
Czy mógłbyś dodać link TIO (lub podobny kompilator online do przetestowania) dla każdego z nich?
Kevin Cruijssen
@KevinCruijssen Dodano. Dane wyjściowe w TIO for perl -psą puste, to musi być błąd w TIO.
Gilles
7

> <>, Retina, Python 2: 144 127 123 bajtów

1 bajt zapisany dzięki @Loovjo przez usunięcie spacji

4 bajty zapisane dzięki @ mbomb007 przy użyciu inputzamiastraw_input

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

Opublikowane w TNB jako wyzwanie , postanowiłem wypróbować tę kombinację języków.

> <>

Wypróbuj online!

IP zaczyna się przesuwać w prawo.

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

Możliwe znaki, które zostaną wprowadzone do wejścia to PRS(ponieważ program przyjmuje tylko pierwszy znak). Ich wartości są ASCII 80, 81a 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

Gdyby dane wejściowe były rockowe, to tak by się stało:

<                      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.

W przeciwnym razie, jeśli dane wejściowe to SCISSORSlub PAPER, to właśnie napotkałby adres IP:

"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

Jeśli dane wejściowe były PAPER, to:

>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.

W przeciwnym razie (jeśli dane wejściowe były SCISSORS):

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

Siatkówka oka

Wypróbuj online!

W takim przypadku Retina uważa każdą parę dwóch linii za parę dopasowania i substytucji. Na przykład próbuje zastąpić wszystko pasujące do pierwszego wiersza drugim wierszem, ale ponieważ pierwszy wiersz nigdy nie jest dopasowany, nigdy nie zastępuje go niczym, co pozwala zachować dane wejściowe.

Python 2

Wypróbuj online!

Program Python wymaga wprowadzania danych między "s.

Pierwsze dwa wiersze to komentarze w Pythonie.

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
źródło
Nie sądzę, żeby przestrzeń po printostatniej linii była konieczna.
Loovjo,
Możesz użyć input()zamiast raw_input().
mbomb007
@Loovjo Dzięki za podpowiedź :)
Kritixi Lithos
@ mbomb007 To nie wydaje się działać
Kritixi Lithos
@KritixiLithos działa, jeśli część python pobiera dane wejściowe z cytatami
undergroundmonorail
0

Ruby, Clojure, Common Lisp - 251 bajtów

(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+'"']))

Bardziej czytelna wersja z białymi spacjami:

(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 zawsze wygrywa, Ruby zawsze rysuje, Common Lisp zawsze przegrywa.

Dla Ruby wszystko w środku 'jest sznurkiem. Rozciąga się na dwóch liniach. Następnie używa []operatora z argumentem ciągu, który zwraca sam łańcuch, jeśli jest obecny w ciągu. Wynik zostanie wydrukowany, Ruby po prostu odzwierciedla dane wejściowe.

Drugi wiersz to komentarz dla Clojure i Common Lisp. Należy użyć kilku evali quote, ponieważ Clojure musi upewnić się, że wszystkie symbole są prawidłowe. Byłoby miło ponownie użyć kodu, ale nawet nthfunkcje mają różne podpisy w tych językach. Zasadniczo Clojure if()ocenia na true i przechodzi do pierwszej gałęzi, gdy wywoływana jest mapa skrótu możliwych wariantów z argumentem odczytanym ze standardowego wejścia. Common Lisp przechodzi do drugiej gałęzi, znajduje pozycję argumentu ze stdin na liście i zwraca odpowiedni element z wynikowej listy.

Myślę, że część Common Lisp może być bardziej golfa.

Zobacz online: Ruby , Common Lisp , Clojure

Cliffroot
źródło
0

Scala, JavaScript i Ook, 167 bajtów

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!
}

Wypróbuj w Scali Wypróbuj w JavaScript Wypróbuj wersję Ook do pieprzenia mózgu

Scala - wygrywa

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 - traci

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
}

Oo! - więzi

Część Ook jest prostym programem dla kotów z ,[.,]mózgiem , przetłumaczonym na Ooka.

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
źródło
Jeśli używasz a[(a.indexOf(s)+2)%3], nie musisz ustawiać a[-1]="rock". Czy nie możesz również umieścić kodu Ook w ciągu JavaScript?
Neil