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 rock
lub paper
lub 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
, SCISSORS
jeśli jest to pożądane.
Być może nie korzystać z różnych wersji tego samego języka (np Python 2 i 3).
Odpowiedzi:
Python, pieprzony mózg i JavaScript,
10399 bajtów Yay poniżej 100 bajtów!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: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ąca0
i listę5
, a także1//1
część,//
w Pythonie jest dzieleniem całkowitym, ale rozpoczyna komentarz w JavaScript. Oto kod pozbawiony tych tokenów:Pierwszy wiersz jest dość oczywisty, po prostu definiuje listę,
p
aby zawierała różne wybory w papierach-kamieniu-nożyczkach. Druga linia definiuje nienazwaną funkcję, która przyjmuje jeden argumentx
i zwraca wybór, który bijex
(np. Poprzedni element wp
)W JavaScript
//
oznacza komentarz jednowierszowy. Podobnie jak w Pythonie pojedyncze tokeny są ignorowane, więc ich kod jest pozbawiony:Działa to podobnie do Pythona, najpierw ustawiając listę,
p
aby zawierała opcje, a następnie definiując anonimową funkcję, która daje przegrany wybór.-~x
jest taki sam,x+1
ale 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\0
zostanie 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.źródło
x=>p[p.indexOf(x)+1]||"rock"//"""
można skrócić dox=>p[(p.indexOf(x)+1)%3]//"""
1//1,[.5,];
[]
w drugiej linii, aby zaoszczędzić więcej bajtów:1//1,;lambda x:p[p.index(x,0)+-1];"""
Python 2, Ruby, Retina,
9083 bajtów-7 bajtów dzięki Value Ink
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
0
jest prawdziwy w Ruby, ale falsey w Pythonie. Wykorzystuje również indeksowanie ujemne zarówno w Pythonie, jak i Ruby.źródło
and
ma pierwszeństwo przed operatoremor
, więcs.index(0and STDIN.gets or input())
działa. Ponadto,gets
jest aliasemSTDIN.gets
w Ruby.V, Brain-flak i Python 2,
97, 86, 81, 77, 75 bajtówDwa 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:
Wyjaśnienie:
Pyton
W Pythonie jest to bardzo proste. Definiujemy listę trzech elementów i zwracamy element tuż przed danymi wejściowymi. Ponieważ
-1
zwraca 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
o
mogło wydawać się arbitralne, ale zdecydowanie nie jest. W Vo
otwiera nowy wiersz i wprowadza nas w tryb wstawiania. Następnie,jest wstawiany do bufora. Następnie odpowiednim kodem jest:
Wyjaśnienie:
źródło
.split()
łatwiej jest pozbyć się różnych nawiasów i cytatów pojawiających się w twoim rozwiązaniu.xx
i zastąpić je,2
aby wykonać polecenie,2f'
ponieważ i tak='
zostanie ono usunięted*
później. EDYCJA: możesz to zrobićt.
?CJam , Retina , PHP,
928685 bajtówPowinien być uruchamiany w PHP przy użyciu
-r
flagi.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: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 niczegorock
,paper
alboscissors
, 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.
źródło
C, C ++, Python;
227226216 bajtówZapisano bajt dzięki @Mat!
Definiuje funkcję
f
we wszystkich językach. Wygrywa w C, więzi w Pythonie, przegrywa w C ++. Podobnie jak C ++ zawsze robi / sCzęść 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'-1
dowiedzieć 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!
źródło
C ++, R, C;
252240226220209 bajtówWykorzystuje 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:
DO:
Wypróbuj online!
źródło
Gawk, Retina, Perl; 68 bajtów
(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,$0
ponieważ zmienna_
jest niezdefiniowana) w zależności od tego, czy zawierak
ac
, a następnie wydrukuj wynik. Zignoruj wszelkie ostrzeżenia o sekwencjach ucieczki, chciałem to zrobić.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ą,
eval
aby ukryć je przed awk.Gawk, Retina
perl -p
; 57 bajtówPodaję to jako bonus, ponieważ przełącznik wiersza poleceń
perl -p
powinien być częścią programu według zwykłych zasad na tej stronie, co sprawiłoby, że nie byłby to poliglot.Znowu z nową linią dla Retina . Tym razem,
perl -p
aby automatycznie wydrukować wydruk, obciążenie perla jest znacznie zmniejszone. Mogę pozwolić, aby zadanie$_
uruchomiło ukryty wydruk w awk .źródło
perl -p
są puste, to musi być błąd w TIO.> <>, Retina, Python 2:
144127123 bajtów1 bajt zapisany dzięki @Loovjo przez usunięcie spacji
4 bajty zapisane dzięki @ mbomb007 przy użyciu
input
zamiastraw_input
Opublikowane w TNB jako wyzwanie , postanowiłem wypróbować tę kombinację języków.
> <>
Wypróbuj online!
IP zaczyna się przesuwać w prawo.
Możliwe znaki, które zostaną wprowadzone do wejścia to
PRS
(ponieważ program przyjmuje tylko pierwszy znak). Ich wartości są ASCII80
,81
a82
.Gdyby dane wejściowe były rockowe, to tak by się stało:
W przeciwnym razie, jeśli dane wejściowe to
SCISSORS
lubPAPER
, to właśnie napotkałby adres IP:Jeśli dane wejściowe były
PAPER
, to:W przeciwnym razie (jeśli dane wejściowe były
SCISSORS
):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.
źródło
print
ostatniej linii była konieczna.input()
zamiastraw_input()
.Ruby, Clojure, Common Lisp - 251 bajtów
Bardziej czytelna wersja z białymi spacjami:
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
eval
iquote
, ponieważ Clojure musi upewnić się, że wszystkie symbole są prawidłowe. Byłoby miło ponownie użyć kodu, ale nawetnth
funkcje mają różne podpisy w tych językach. Zasadniczo Clojureif()
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
źródło
Scala, JavaScript i Ook, 167 bajtów
Wypróbuj w Scali Wypróbuj w JavaScript Wypróbuj wersję Ook do pieprzenia mózgu
Scala - wygrywa
JavaScript - traci
Oo! - więzi
Część Ook jest prostym programem dla kotów z
,[.,]
mózgiem , przetłumaczonym na Ooka.źródło
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?