Đá, Polyglot, Kéo


68

Viết một chương trình là một đa âm bằng ba ngôn ngữ chơi trò kéo giấy Rock Rock .

Các đầu vào đối với bất kỳ phiên bản của chương trình luôn là một trong những chuỗi rockhay paperhay scissors.

Trong ngôn ngữ đầu tiên, chương trình phải xuất ra lựa chọn kéo giấy Rock Rock, đánh bại đầu vào:

Input     Output
rock      paper
paper     scissors
scissors  rock

Trong ngôn ngữ thứ hai, chương trình phải xuất ra lựa chọn kéo giấy Rock Rock liên kết đầu vào:

Input     Output
rock      rock
paper     paper
scissors  scissors

Trong ngôn ngữ thứ ba, chương trình phải xuất ra sự lựa chọn kéo giấy Rock Rock mà thua với đầu vào:

Input     Output
rock      scissors
paper     rock
scissors  paper

Mã ngắn nhất tính bằng byte thắng. Tiebreaker là câu trả lời được bình chọn cao hơn.

Các đầu vào và / hoặc đầu ra có thể tùy chọn có một dòng mới, nhưng nếu không thì chỉ nên là chuỗi / rock/ đơn giản . Bạn có thể sử dụng chữ hoa , , nếu muốn.paperscissorsROCKPAPERSCISSORS

Bạn không được sử dụng các phiên bản khác nhau của cùng một ngôn ngữ (ví dụ: Python 2 và 3).


Có thể một lỗi ngôn ngữ để thoát?
Kritixi Lithos

2
@KritixiLithos Đi với sự đồng thuận meta . "Tôi nghĩ rằng việc chấm dứt với một lỗi hoặc một ngoại lệ chưa được xử lý là tốt ở đây, miễn là nó không tạo ra đầu ra đi lạc cho STDOUT."
Sở thích của Calvin

2
Không bao giờ hoàn toàn chắc chắn với các đa âm, các ngôn ngữ khác nhau có thể nhập liệu theo các cách khác nhau không?
Jonathan Allan

3
@Jonathan ALLan Không sao đâu. Đối với một số bộ ngôn ngữ chỉ có một số hình thức đầu vào nhất định, nó sẽ là cần thiết.
Sở thích của Calvin

Chuyện gì đã xảy ra với Lizard, Spock? bigbangtheory.wikia.com/wiki/Rock_Paper_Sc khoa_Lizard_Spock
Ole Tange

Câu trả lời:


60

Python, brainfuck và JavaScript, 103 99 byte Yay dưới 100 byte!

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

Trong Python, điều này xác định một hàm đánh bại đầu vào, trong brainfuck, nó chỉ là một chương trình mèo đơn giản và trong JavaScript, nó bị mất. Đây là phiên bản cung cấp tên cho các hàm fvà cũng nhắc nhở nhập liệu trong JavaScript và 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

Dùng thử trực tuyến (phiên bản cũ hơn): Python , brainfuck , JavaScript

Giải trình:

Trong Python, """..."""là một chuỗi nhiều dòng, có thể được sử dụng như bất kỳ mã thông báo nào. Khi đặt độc lập, nó không làm gì cả. Tôi sử dụng điều này để "ẩn" mã JavaScript khỏi Python. Điều tương tự cũng xảy ra với (0,[.5,])bit, nó chỉ là một bộ chứa một 0và một danh sách 5, và cũng là 1//1một phần, //trong Python là phép chia số nguyên, nhưng bắt đầu một nhận xét bằng JavaScript. Đây là mã bị tước của các mã thông báo này:

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

Dòng đầu tiên khá tự giải thích, nó chỉ xác định danh sách pđể chứa các lựa chọn khác nhau trong kéo giấy. Dòng thứ hai xác định một hàm không tên có một đối số xvà trả lại lựa chọn có nhịp x(ví dụ: phần tử trước đó trong p)


Trong JavaScript, //biểu thị một nhận xét một dòng. Tương tự như Python, các mã thông báo đơn lẻ bị bỏ qua, vì vậy mã bị tước của các mã thông báo này là:

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

Điều này hoạt động tương tự như Python, trước tiên bằng cách thiết lập danh sách pđể chứa các lựa chọn và sau đó xác định một hàm ẩn danh mang lại sự lựa chọn bị mất. -~xlà giống như x+1nhưng với quyền ưu tiên cao hơn để tôi có thể bỏ qua các parens.


Trong brainfuck, mọi nhân vật ngoại trừ +-,.[]<>được loại bỏ, để lại điều này:

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

Lệnh ,đọc một byte đầu vào, .in nó và [...]lặp trong khi giá trị khác không. Những gì chương trình này làm sau đó là đọc đầu vào và in nó một ký tự tại một thời điểm cho đến khi \0tìm thấy ký tự . Vì chúng tôi không có mã đó, chúng tôi có thể bỏ qua phần còn lại của chương trình. Trong thực tế, điều này chỉ lặp lại bất cứ điều gì người dùng gõ vào, buộc chúng một cách hiệu quả.


Đã làm việc trên một giải pháp rất giống nhau nhưng bạn đã đánh bại tôi với nó :). Bạn phải cập nhật btw liên kết Javascript TIO, nó khác với hai liên kết khác.
DimP

2
x=>p[p.indexOf(x)+1]||"rock"//"""có thể rút ngắn thànhx=>p[(p.indexOf(x)+1)%3]//"""
Luke

13
+1 Tôi chưa bao giờ thấy Brainfuck bị che giấu quá tốt. Thông thường, rõ ràng nếu một polyglot cũng chứa BF. Không phải trong cái này!
vsz

Tôi nghĩ rằng bạn có thể di chuyển chương trình BF xung quanh một chút để tiết kiệm một hoặc hai byte:1//1,[.5,];
ETHproductions

Như một vấn đề thực tế, tôi nghĩ rằng bạn có thể sử dụng dòng hiện có []trên dòng thứ hai để tiết kiệm nhiều byte hơn:1//1,;lambda x:p[p.index(x,0)+-1];"""
Sản phẩm ETH

40

Python 2, Ruby, Retina, 90 83 byte

-7 byte nhờ Giá trị mực

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

Dùng thử trực tuyến: Python , Ruby , Retina

Thắng trong Ruby, thua Python và quan hệ với Retina. Giải pháp này sử dụng thực tế 0là sự thật trong Ruby nhưng falsey trong Python. Nó cũng sử dụng lập chỉ mục tiêu cực trong cả Python và Ruby.


andcó quyền ưu tiên nhà điều hành or, vì vậy s.index(0and STDIN.gets or input())công trình. Ngoài ra, getslà một bí danh cho STDIN.getsRuby.
Mực giá trị

10
+1 không chỉ nhận xét mã theo nhiều cách khác nhau!
leo

@ValueInk Cảm ơn bạn! Tôi đoán rằng phải có một cách ngắn gọn hơn để có được đầu vào trong Ruby, và hóa ra là có
nghiện toán học

21

V, Brain-flak và Python 2, 97, 86, 81, 77 , 75 byte

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

Hai byte được lưu nhờ vào @ nmjcman101!

Điều này thật thú vị! Tôi thích câu trả lời này rất nhiều vì đó là một tổng quan tuyệt vời về các ngôn ngữ tôi thích: Biên tập viên yêu thích của tôi, ngôn ngữ phi bí truyền yêu thích của tôi và ngôn ngữ tôi đã viết. (Về mặt kỹ thuật python 3 thì tốt hơn, nhưng python 2 thì golfier hơn ¯\_(ツ)_/¯).

Hãy thử trực tuyến! trong Python (được sửa đổi một chút để bạn có thể thấy đầu ra), trong đó in những gì mất vào đầu vào.

Hãy thử trực tuyến! trong Brain-Flak, in những gì liên quan đến đầu vào.

Hãy thử trực tuyến! trong V, trong đó in những gì nhịp đập đầu vào.

Vì V dựa vào các ký tự ASCII không thể in được, nên đây là một 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

Giải trình:

Con trăn

Trong python, điều này rất đơn giản. Chúng tôi xác định danh sách ba phần tử và trả về phần tử ngay trước đầu vào. Vì -1trả về phần tử phía sau, điều này hoạt động theo vòng tròn, và tất cả đều rất đơn giản và dễ dàng. Sau đó, tất cả mọi thứ sau #là một bình luận.

Brain-Flak

Điều này cũng cực kỳ đơn giản trong flak não. Nếu chúng ta phải thắng hoặc thua, đây có thể là vài trăm byte. Nhưng điều này thực sự hoạt động trong 0 byte. Khi bắt đầu chương trình, tất cả các đầu vào được tải lên ngăn xếp. Vào cuối chương trình, toàn bộ ngăn xếp được in ngầm.

Khi chúng tôi xóa tất cả các ký tự không liên quan, mã não sẽ thấy là

()[()]

Điều này chỉ đơn giản là đánh giá 1 + -1, nhưng vì giá trị này hoàn toàn không được sử dụng, đó là một NOOP.

V

Đây là nơi nó có một chút kỳ lạ. Đặt tên cho danh sách trăn ocó thể có vẻ độc đoán, nhưng chắc chắn là không. Trong V, omở ra một dòng mới và đưa chúng ta vào chế độ chèn. Sau đó,

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

được chèn vào bộ đệm. Sau đó, mã có liên quan là:

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

Giải trình:

<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

@WheatWizard Trong Python, không có lý do gì cả (ngoại trừ việc nó có cùng độ dài). Nhưng nó phá hỏng mọi thứ trong V.
DJMcMayhem

@WheatWizard Nguyên nhân V là một ngôn ngữ thực sự kỳ lạ, và đây là một nhiệm vụ thực sự kỳ lạ đối với nó. Mọi thứ chủ yếu dựa vào bố cục của các nhân vật, và .split()dễ dàng thoát khỏi các dấu ngoặc đơn và trích dẫn khác nhau xuất hiện trong giải pháp của bạn.
DJMcMayhem

Siêu nhỏ, nhưng bạn có thể lấy ra xxvà thay thế nó bằng một 2lệnh để tạo lệnh 2f'vì sau ='này sẽ bị xóa d*sau đó. EDIT: bạn có thể làm cho nó t.?
nmjcman101

@ nmjcman101 Oooh, ý tưởng tuyệt vời, tuyệt vời. Cảm ơn vì tiền hỗ trợ!
DJMcMayhem

16

CJam , Retina , PHP, 92 86 85 byte

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

Nên được chạy trong PHP bằng cách sử dụng -rcờ.

Hãy thử nó trong CJam

Hãy thử nó trong Retina

Hãy thử nó trong PHP

Camam

Trong CJam, tất cả các chữ in hoa là các biến được xác định trước. Trên dòng đầu tiên, nhiều giá trị trong số này được đẩy lên ngăn xếp, cùng với một số chuỗi ký tự chuỗi và mảng. Một số tăng, giảm và các hoạt động khác được thực hiện.

Sau tất cả điều đó, ngăn xếp được gói trong một mảng ( ]) và bị loại bỏ ( ;), vì vậy không có thứ gì khác quan trọng cả. Chương trình chính của CJam chỉ đơn giản là:

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

Võng mạc

Điều này gần như cảm thấy như gian lận ...

Retina sẽ thay thế bất kỳ trận đấu nào của regex ECHO["rock",0,"scissors","paper"][ORD(READLINE())%4];trong đầu vào bằng #];"scissors paper rock"S/rci=. Dù regex này phù hợp, chắc chắn nó không phù hợp với bất cứ điều gì trong rock, paperhoặc scissors, vì vậy thay không được thực hiện. Đầu vào không sửa đổi sau đó là đầu ra ngầm.

PHP

Dòng thứ hai là một bình luận, vì vậy nó bị bỏ qua.

Dòng đầu tiên sử dụng thuật toán tương tự như phần CJam, nhưng với thứ tự kết quả khác nhau.


1
Các chức năng TIL PHP không phân biệt chữ hoa chữ thường.
gcampbell

14

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

Đã lưu một byte nhờ @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");}
//"""

Xác định một chức năng ftrong tất cả các ngôn ngữ. Thắng trong C, quan hệ bằng Python, thua C ++. Giống như C ++ luôn luôn làm / s

Phần giữa /**/là một khối nhận xét trong C và C ++ trong khi đó là khai báo hàm lambda trong Python. Về cơ bản, nó so sánh ký tự đầu tiên của đối số hàm và trả về di chuyển bắt đầu bằng chữ cái đó.

Phần giữa """s là một chuỗi nhiều dòng trong Python trong khi đó là khai báo hàm trong cả C và C ++. sizeof'b'-1chỉ ra nếu ngôn ngữ hiện tại là C của C ++. Nó có giá trị trung thực nếu kích thước khác 1, giá trị giả khác. Trong C ký tự chữ là loại dài 4 byte trong khi trong C ++, chúng là loại byte đơn. Sau đó, sau khi ngôn ngữ được tìm ra, nó chỉ nhìn vào chữ cái đầu tiên của đầu vào và đầu ra tương ứng.

C

Hãy thử trực tuyến!

C ++

Hãy thử trực tuyến!

Con trăn

Hãy thử trực tuyến!


4
"Phần nằm giữa" "" là một khối nhận xét trong Python "Đây thực sự là một chuỗi nhiều dòng.
ivzem

10

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

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

Làm cho việc sử dụng sự khác biệt giữa C và C ++ là kích thước của một ký tự bằng chữ là 4 byte trong C và 1 byte trong C ++.

C ++:

Hãy thử trực tuyến!

R:

Kết quả:

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

Hãy thử trực tuyến!


8

Gawk, võng mạc, Perl; 68 byte

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

(với một dòng mới ở cuối)

Gawk (người chiến thắng)

Một số rác vì lợi ích của Perl, sau đó thay đổi nội dung dòng ( $_giống như $0vì biến _không xác định) tùy thuộc vào việc nó có chứa a khoặc a c, sau đó in kết quả. Bỏ qua bất kỳ cảnh báo về trình tự thoát, tôi có nghĩa là để làm điều đó.

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

Võng mạc (cà vạt)

Thủ thuật tương tự như Hoàng hôn cơ bản và những thứ khác: thay thế các trận đấu của một số regrec ngớ ngẩn trên dòng đầu tiên bằng nội dung của dòng thứ hai, vì vậy hãy chuyển đầu vào qua.

Perl (kẻ thua cuộc)

Đọc một dòng và chuyển đổi nó thành chữ hoa, sau đó chọn một từ dựa trên một chữ cái mà nó chứa và in kết quả. Bước đầu tiên và cuối cùng được gói bằng cách sử dụng evalđể ẩn chúng khỏi awk.

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

Gawk, võng mạc , perl -p; 57 byte

Tôi đang tham gia phần thưởng này vì phần chuyển đổi dòng lệnh perl -pđược cho là một phần của chương trình theo các quy tắc thông thường trên trang web này, điều này sẽ khiến nó không phải là một polyglot.

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

Một lần nữa với một dòng mới cuối cùng cho Retina . Lần này, với perl -pviệc in đầu ra tự động, chi phí perl được giảm đáng kể. Tôi có thể để nhiệm vụ $_kích hoạt một bản in ngầm trong awk .


Có lẽ bạn có thể thêm một liên kết TIO (hoặc một trình biên dịch trực tuyến tương tự để kiểm tra) cho mỗi liên kết đó?
Kevin Cruijssen

@KevinCruijssen Đã thêm. Đầu ra trên TIO perl -ptrống, nó phải là một lỗi trên TIO.
Gilles

7

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

Lưu 1 byte nhờ @Loovjo bằng cách xóa khoảng trắng

4 byte được lưu nhờ @ mbomb007 bằng cách sử dụng inputthay vìraw_input

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

Đăng trong TNB như một thách thức , tôi quyết định thử kết hợp các ngôn ngữ này.

> <>

Hãy thử trực tuyến!

IP bắt đầu di chuyển sang phải.

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

Các ký tự có thể sẽ được đưa vào đầu vào là PRS(vì chương trình chỉ lấy ký tự đầu tiên). Giá trị ASCII của chúng là 80, 8182.

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

Nếu đầu vào là rock, thì đây là điều sẽ xảy ra:

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

Mặt khác, nếu đầu vào là SCISSORShoặc PAPER, đây là những gì IP sẽ gặp phải:

"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

Nếu đầu vào là PAPER , thì:

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

Mặt khác (nếu đầu vào là SCISSORS ):

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

Võng mạc

Hãy thử trực tuyến!

Trong trường hợp này, Retina coi mỗi cặp hai dòng là một cặp khớp và thay thế. Ví dụ, nó cố gắng thay thế bất cứ thứ gì khớp với dòng đầu tiên bằng dòng thứ hai, nhưng vì dòng đầu tiên không bao giờ khớp, nên nó không bao giờ thay thế nó bằng bất cứ thứ gì, do đó bảo toàn đầu vào.

Con trăn 2

Hãy thử trực tuyến!

Chương trình Python yêu cầu đầu vào được đặt ở giữa "s.

Hai dòng đầu tiên là các bình luận trong 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

Tôi không nghĩ rằng không gian sau printở dòng cuối cùng là cần thiết.
Loovjo

Bạn có thể sử dụng input()thay vì raw_input().
mbomb007

@Loovjo Cảm ơn vì tiền boa :)
Kritixi Lithos

@ mbomb007 Điều đó dường như không hoạt động
Kritixi Lithos

@KritixiLithos nó hoạt động nếu phần trăn có đầu vào với dấu ngoặc kép
undergroundmonorail

0

Ruby, Clojure, Lisp thông thường - 251 byte

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

Phiên bản dễ đọc hơn với khoảng trắng:

(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 luôn thắng, Ruby luôn hòa, Lisp chung luôn thua.

Đối với Ruby mọi thứ bên trong 's là một chuỗi. Nó trải dài trên hai dòng. Sau đó, nó sử dụng []toán tử với một đối số chuỗi trả về chính chuỗi đó nếu nó có trong chuỗi. Kết quả được in ra, Ruby chỉ phản chiếu đầu vào.

Dòng thứ hai là một nhận xét cho Clojure và Common Lisp. Một bó evalquotephải được sử dụng vì Clojure cần đảm bảo rằng tất cả các biểu tượng đều hợp lệ. Sẽ tốt hơn nếu sử dụng lại mã nhiều hơn nhưng ngay cả nthchức năng cũng có chữ ký khác nhau trong các ngôn ngữ này. Về cơ bản, Clojure if()đánh giá là đúng và nó đi đến nhánh đầu tiên khi bản đồ băm của các biến thể có thể được gọi với đối số được đọc từ stdin. Lisp thông thường đi đến nhánh thứ hai, nó tìm vị trí của đối số từ stdin trong danh sách và trả về mục tương ứng từ danh sách kết quả.

Tôi đoán phần Lisp chung có thể được đánh gôn nhiều hơn.

Xem trực tuyến: Ruby , Lisp thông thường , Clojure


0

Scala, Javascript và Ook, 167 byte

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

Dùng thử trong Scala Dùng thử trong Javascript Hãy thử phiên bản Brainfuck của Ook

Scala - chiến thắng

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

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
}

Ôi! - cà vạt

Phần Ook là chương trình mèo brainfuck đơn giản được đặt ,[.,]tên cho Ook.

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

Nếu bạn sử dụng a[(a.indexOf(s)+2)%3]thì bạn không cần phải thiết lập a[-1]="rock". Ngoài ra, bạn có thể không đặt mã Ook bên trong chuỗi JavaScript không?
Neil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.