ร็อคพูดได้หลายภาษากรรไกร


68

เขียนโปรแกรมที่เป็นพูดได้หลายภาษาในภาษาที่สามที่เล่นเป่ายิ้งฉุบ

การป้อนข้อมูลสำหรับรุ่นของโปรแกรมใด ๆ ที่เป็นเสมอหนึ่งของสตริงrockหรือหรือpaperscissors

ในภาษาแรกโปรแกรมจะต้องเลือกตัวเลือก rock – paper - scissors ที่จะให้อินพุต:

Input     Output
rock      paper
paper     scissors
scissors  rock

ในภาษาที่สองโปรแกรมจะต้องเลือกตัวเลือก rock-paper - scissors ที่เชื่อมต่อกับอินพุต:

Input     Output
rock      rock
paper     paper
scissors  scissors

ในภาษาที่สามโปรแกรมจะต้องเอาท์พุทตัวเลือกร็อค - กระดาษ - กรรไกรที่เสียไปกับอินพุต:

Input     Output
rock      scissors
paper     rock
scissors  paper

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ Tiebreaker เป็นคำตอบที่ได้รับคะแนนสูงกว่า

อินพุตและ / หรือเอาต์พุตอาจมีทางเลือกขึ้นบรรทัดใหม่ แต่ไม่เช่นนั้นควรเป็นสตริงธรรมดาrock/ paper/ scissorsคุณอาจจะใช้ตัวพิมพ์ใหญ่ROCK, PAPER, SCISSORSถ้าต้องการ

คุณไม่สามารถใช้ภาษาเดียวกันเวอร์ชันต่าง ๆ (เช่น Python 2 และ 3)


ภาษามีข้อผิดพลาดในการออกหรือไม่
Kritixi Lithos

2
@KritixiLithos ไปกับconcensus เมตา "ฉันคิดว่าการยุติด้วยข้อผิดพลาดหรือข้อยกเว้นที่ไม่ได้ตรวจสอบนั้นทำได้ดีที่นี่ตราบใดที่มันไม่ได้สร้างผลลัพธ์หลงทางไปยัง STDOUT"
งานอดิเรกของ Calvin

2
ไม่แน่ใจเกี่ยวกับรูปหลายภาษาภาษาที่แตกต่างกันสามารถรับข้อมูลด้วยวิธีต่างๆได้หรือไม่?
Jonathan Allan

3
@JanathanAllan ไม่เป็นไร สำหรับชุดภาษาบางอย่างที่มีรูปแบบการป้อนข้อมูลบางอย่างเท่านั้นก็จำเป็น
งานอดิเรกของ Calvin

เกิดอะไรขึ้นกับ Lizard, Spock? bigbangtheory.wikia.com/wiki/Rock_Paper_Scissors_Lizard_Spock
Ole Tange

คำตอบ:


60

Python, brainfuck และ JavaScript, 103 99 ไบต์Yay ภายใต้ 100 ไบต์!

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

ใน Python มันจะกำหนดฟังก์ชั่นที่จะเอาชนะอินพุตใน brainfuck มันเป็นเพียงโปรแกรม cat อย่างง่ายและใน JavaScript ก็จะสูญเสีย นี่คือรุ่นที่ให้ชื่อฟังก์ชั่นfและยังแจ้งให้ป้อนข้อมูลใน JavaScript และ 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

ลองออนไลน์ (รุ่นเก่า): Python , brainfuck , JavaScript

คำอธิบาย:

ใน Python """..."""เป็นสตริงหลายบรรทัดซึ่งสามารถใช้เป็นโทเค็นใด ๆ ก็ได้ เมื่ออยู่คนเดียวมันไม่ได้ทำอะไรเลย ฉันใช้สิ่งนี้เพื่อ "ซ่อน" รหัส JavaScript จาก Python สิ่งเดียวกันนี้สำหรับ(0,[.5,])บิตมันเป็นเพียงแค่ tuple ที่มี a 0และรายการ5และ1//1ส่วน//ใน Python ก็คือการหารจำนวนเต็ม แต่เริ่มแสดงความคิดเห็นใน JavaScript นี่คือรหัสที่ถอดโทเค็นเหล่านี้:

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

บรรทัดแรกนั้นอธิบายได้ด้วยตัวเองสวยมากเพียงแค่กำหนดรายการpให้มีตัวเลือกต่าง ๆ ในกรรไกรกระดาษร็อค บรรทัดที่สองกำหนดฟังก์ชั่นที่ไม่มีชื่อซึ่งใช้เวลาหนึ่งอาร์กิวเมนต์xและให้ทางเลือกที่ชนะx(เช่นองค์ประกอบก่อนหน้าในp)


ใน JavaScript //แสดงความคิดเห็นแบบบรรทัดเดียว ในทำนองเดียวกันกับ Python โทเค็นเดี่ยวจะถูกละเว้นดังนั้นโค้ดที่ถูกปล้นของโทเค็นเหล่านี้คือ:

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

สิ่งนี้ทำงานคล้ายกับ Python โดยการตั้งค่ารายการpให้มีตัวเลือกก่อนจากนั้นกำหนดฟังก์ชันที่ไม่ระบุชื่อที่ให้ตัวเลือกการสูญเสีย -~xเหมือนกับx+1แต่มีลำดับความสำคัญสูงกว่าเพื่อให้ฉันสามารถข้าม parens ได้


ใน brainfuck ตัวละครทุกตัวยกเว้น+-,.[]<>จะถูกลบออกโดยปล่อยสิ่งนี้:

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

คำสั่ง,อ่านอินพุตหนึ่งไบต์.พิมพ์และ[...]ลูปในขณะที่ค่าไม่เป็นศูนย์ สิ่งที่โปรแกรมนี้ทำคืออ่านอินพุตและพิมพ์อักขระทีละตัวจนกว่า\0จะพบอักขระ เนื่องจากเราไม่มีรหัสนั้นเราจึงไม่สนใจโปรแกรมที่เหลือ ด้วยเหตุนี้สิ่งนี้จะสะท้อนสิ่งที่ผู้ใช้พิมพ์กลับมาผูกมัดพวกเขาได้อย่างมีประสิทธิภาพ


กำลังทำงานกับโซลูชันที่คล้ายกันมากแต่คุณเอาชนะฉันได้ :) คุณต้องอัปเดตลิงก์ Javascript TIO btw ซึ่งแตกต่างจากอีกสองลิงก์
DimP

2
x=>p[p.indexOf(x)+1]||"rock"//"""อาจย่อให้เหลือx=>p[(p.indexOf(x)+1)%3]//"""
ลุค

13
+1 ฉันไม่เคยเห็น Brainfuck ถูกซ่อนไว้อย่างดี โดยปกติแล้วจะเห็นได้ชัดว่าหากคนหลายภาษามี BF ไม่ได้อยู่ในนี้!
vsz

ฉันคิดว่าคุณสามารถย้ายโปรแกรม BF ไปรอบ ๆ เพื่อบันทึกไบต์หรือสอง:1//1,[.5,];
ETHproductions

ตามความเป็นจริงฉันคิดว่าคุณสามารถใช้ที่มีอยู่[]ในบรรทัดที่สองเพื่อบันทึกไบต์เพิ่มเติม:1//1,;lambda x:p[p.index(x,0)+-1];"""
ETHproductions

40

Python 2, Ruby, Retina, 90 83 ไบต์

-7 ไบต์ขอบคุณ Value Ink

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

ลองใช้งานออนไลน์: Python , Ruby , Retina

ชนะใน Ruby แพ้ Python และสัมพันธ์ใน Retina วิธีการแก้ปัญหานี้ใช้ประโยชน์จากความจริงที่ว่าเป็นจริง0ในรูบี แต่เท็จใน Python นอกจากนี้ยังใช้ประโยชน์จากการจัดทำดัชนีเชิงลบทั้งใน Python และ Ruby


andมีความสำคัญมากกว่าผู้ประกอบการorดังนั้นs.index(0and STDIN.gets or input())ทำงาน นอกจากนี้ยังgetsมีนามแฝงสำหรับSTDIN.getsในทับทิม
หมึกมูลค่า

10
+1 สำหรับไม่ใช่แค่ใส่รหัสในรูปแบบต่าง ๆ !
สิงห์

@ValueInk ขอขอบคุณ! ฉันคิดว่าต้องมีวิธีรัดกุมกว่านี้ในการรับอินพุตใน Ruby และปรากฎว่ามี
คณิตศาสตร์ junkie

21

V, Brain-flak และ Python 2, 97, 86, 81, 77 , 75 bytes

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

บันทึกสองไบต์ด้วย @ nmjcman101!

มันสนุกสุด ๆ ! ฉันชอบคำตอบนี้มากเพราะมันเป็นภาพรวมที่ยอดเยี่ยมของภาษาที่ฉันชอบ: โปรแกรมแก้ไขที่ฉันชอบภาษาที่ไม่ลึกลับและภาษาที่ฉันเขียน (ในทางเทคนิคไพ ธ อน 3 ดีกว่า แต่ไพ ธ อน 2 เป็นนักกอล์ฟมากขึ้น¯\_(ツ)_/¯)

ลองออนไลน์! ใน Python (แก้ไขเล็กน้อยเพื่อให้คุณเห็นผลลัพธ์) ซึ่งพิมพ์สิ่งที่สูญเสียไปกับอินพุต

ลองออนไลน์! ใน Brain-Flak ซึ่งพิมพ์สิ่งที่สัมพันธ์กับอินพุต

ลองออนไลน์! ใน V ซึ่งพิมพ์สิ่งที่เต้นอินพุต

เนื่องจาก V ขึ้นอยู่กับอักขระ ASCII ที่ไม่สามารถพิมพ์ได้นี่คือ 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

คำอธิบาย:

หลาม

ในไพ ธ อนนี่ตรงไปตรงมามาก เรากำหนดรายการขององค์ประกอบทั้งสามและส่งกลับองค์ประกอบก่อนการป้อนข้อมูล ตั้งแต่-1ส่งคืนองค์ประกอบด้านหลังสิ่งนี้จะทำงานเป็นวงกลมและมันก็ตรงไปตรงมาและง่ายมาก จากนั้นทุกอย่างหลังจากนั้น#คือความคิดเห็น

Brain-Flak

นี่คือยังตรงไปตรงมามากในสมองสะเก็ดระเบิด ถ้าเราต้องชนะหรือแพ้นี่อาจจะเป็นหลายร้อยไบต์ แต่ใช้งานได้จริงใน 0 ไบต์ เมื่อเริ่มต้นโปรแกรมอินพุตทั้งหมดจะถูกโหลดลงในสแต็ก ในตอนท้ายของโปรแกรมสแต็กทั้งหมดจะถูกพิมพ์โดยปริยาย

เมื่อเราลบตัวอักษรที่ไม่เกี่ยวข้องออกไปทั้งหมดโค้ดที่ทำให้สมองเห็นก็คือ

()[()]

ซึ่งประเมินเพียง1 + -1แต่เนื่องจากค่านี้ไม่ได้ใช้เลยเป็น NOOP

V

นี่คือที่ที่มันแปลก ๆ การตั้งชื่อรายการไพ ธ อนoอาจดูเหมือนว่าเป็นเรื่องง่าย แต่ก็ไม่แน่นอน ใน V oเปิดขึ้นบรรทัดใหม่และทำให้เราอยู่ในโหมดแทรก จากนั้น

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

ถูกแทรกลงในบัฟเฟอร์ หลังจากนั้นรหัสที่เกี่ยวข้องคือ:

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

คำอธิบาย:

<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 ใน Python ไม่มีเหตุผลไม่มากเกินไป (ยกเว้นว่ามันมีความยาวเท่ากัน) แต่มันทำลายทุกอย่างใน V.
DJMcMayhem

@WeatWizard Cause V เป็นภาษาแปลก ๆ และนี่เป็นงานที่แปลกสำหรับมัน ทุกอย่างขึ้นอยู่กับการจัดวางของตัวละครเป็นอย่างมากและ.split()ง่ายต่อการกำจัดวงเล็บและคำพูดต่าง ๆ ที่ปรากฏในโซลูชันของคุณ
DJMcMayhem

ผู้เยาว์ที่ยอดเยี่ยม แต่คุณสามารถนำออกxxและแทนที่ด้วย a 2เพื่อสร้างคำสั่ง2f'เนื่องจาก='จะถูกลบในd*ภายหลัง แก้ไข: คุณอาจจะสามารถทำได้t.หรือไม่
nmjcman101

@ nmjcman101 Oooh น่ารักน่าประทับใจ ขอบคุณสำหรับทิป!
DJMcMayhem

16

CJam , Retina , PHP, 92 86 85 ไบต์

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

ควรรันใน PHP โดยใช้-rแฟล็ก

ลองใช้ใน CJam

ลองใช้ใน Retina

ลองใช้ใน PHP

CJam

ใน CJam ตัวพิมพ์ใหญ่ทั้งหมดเป็นตัวแปรที่กำหนดไว้ล่วงหน้า ในบรรทัดแรกค่าเหล่านี้จำนวนมากถูกผลักลงบนสแต็กพร้อมกับสตริงและอาร์เรย์ตัวอักษรบางตัว มีการดำเนินการเพิ่มขึ้นลดลงและการดำเนินการอื่น ๆ

หลังจากนั้นสแต็กจะถูกห่อในอาร์เรย์ ( ]) และทิ้ง ( ;) ดังนั้นจึงไม่มีสิ่งอื่นใดที่สำคัญเลย โปรแกรม CJam หลักเป็นเพียง:

"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 จะแทนการแข่งขันของ regex ใด ๆในการป้อนข้อมูลด้วยECHO["rock",0,"scissors","paper"][ORD(READLINE())%4]; #];"scissors paper rock"S/rci=สิ่งที่ regex นี้ตรงกับมันแน่นอนไม่ตรงกับสิ่งที่อยู่ในrock, paperหรือscissorsจึงไม่มีการเปลี่ยนตัวทำ อินพุตที่ไม่ได้แก้ไขจะถูกส่งออกโดยปริยาย

PHP

บรรทัดที่สองคือความคิดเห็นดังนั้นจึงถูกละเว้น

บรรทัดแรกใช้อัลกอริทึมเดียวกับส่วน CJam แต่มีการเรียงลำดับผลลัพธ์ที่แตกต่างกัน


1
ฟังก์ชัน TIL PHP ไม่คำนึงถึงขนาดตัวพิมพ์
gcampbell

14

C, C ++, Python; 227 226 216 ไบต์

บันทึกเป็นไบต์ด้วย @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");}
//"""

กำหนดฟังก์ชั่นfในทุกภาษา ชนะใน C, เสมอใน Python, แพ้ใน C ++ เช่นเดียวกับ C ++ ทำ/ sเสมอ

ส่วนระหว่าง/*และกับ*/คือบล็อกความคิดเห็นใน C และ C ++ ในขณะที่มันเป็นการประกาศฟังก์ชั่นแลมบ์ดาใน Python โดยทั่วไปจะเปรียบเทียบอักขระตัวแรกของอาร์กิวเมนต์ฟังก์ชันและส่งคืนการย้ายที่เริ่มต้นด้วยตัวอักษรนั้น

ส่วนระหว่าง"""s คือสตริงหลายบรรทัดใน Python ในขณะที่เป็นการประกาศฟังก์ชันใน C และ C ++ sizeof'b'-1คิดออกว่าภาษาปัจจุบันคือ C ของ C ++ มันมีค่าจริงถ้าขนาดอื่นนอกเหนือจาก 1 เป็นค่าเท็จ ในตัวอักษร C เป็นตัวอักษรแบบยาว 4 ไบต์ในขณะที่ C ++ จะเป็นแบบไบต์เดียว จากนั้นหลังจากที่มีการหาภาษามันก็แค่ดูที่ตัวอักษรตัวแรกของการป้อนข้อมูลและผลลัพธ์ตาม

C

ลองออนไลน์!

C ++

ลองออนไลน์!

หลาม

ลองออนไลน์!


4
"ส่วนที่อยู่ระหว่าง" "" เป็นบล็อกความคิดเห็นใน Python "จริงๆแล้วมันเป็นสตริงหลาย
บรรทัด

10

C ++, R, C; 252 240 226 220 209 ไบต์

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

ทำให้การใช้ความแตกต่างระหว่าง C และ C ++ ที่ขนาดของตัวอักษรตัวอักษรคือ 4 ไบต์ใน C และ 1 ไบต์ใน C ++

C ++:

ลองออนไลน์!

R:

ผลลัพธ์:

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

ลองออนไลน์!


8

Gawk, Retina, Perl; 68 ไบต์

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

(ขึ้นบรรทัดใหม่ในตอนท้าย)

Gawk (ผู้ชนะ)

ขยะบางอย่างเพื่อประโยชน์ของ Perl จากนั้นเปลี่ยนเนื้อหาของบรรทัด ( $_ซึ่งเหมือนกับ$0ตัวแปรเนื่องจาก_ไม่ได้กำหนด) ขึ้นอยู่กับว่ามีkหรือหนึ่งcแล้วพิมพ์ผลลัพธ์ ไม่สนใจคำเตือนใด ๆ เกี่ยวกับ escape sequences ฉันต้องการทำเช่นนั้น

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

จอประสาทตา (มัด)

เคล็ดลับแบบเดียวกับBasic Sunsetและอื่น ๆ : แทนที่การจับคู่ของ regexp ที่เซ่อบางอย่างในบรรทัดแรกด้วยเนื้อหาของบรรทัดที่สองดังนั้นส่งผ่านอินพุต

Perl (ผู้แพ้)

อ่านบรรทัดและแปลงเป็นตัวพิมพ์ใหญ่จากนั้นเลือกคำที่ประกอบด้วยตัวอักษรที่มีอยู่แล้วพิมพ์ผลลัพธ์ ขั้นตอนแรกและขั้นสุดท้ายจะถูกห่อไว้โดยใช้evalเพื่อซ่อนพวกเขาจาก awk

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

เหยี่ยว, เรตินา, perl -p; 57 ไบต์

ฉันกำลังป้อนสิ่งนี้เป็นโบนัสเนื่องจากการสลับบรรทัดคำสั่งperl -pควรจะเป็นส่วนหนึ่งของโปรแกรมตามกฎปกติของไซต์นี้ซึ่งจะทำให้ไม่ใช่ภาษาพูดได้หลายภาษา

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

อีกครั้งกับการขึ้นบรรทัดใหม่สุดท้ายสำหรับRetina ในครั้งนี้หากperl -pต้องการพิมพ์เอาต์พุตโดยอัตโนมัติค่าใช้จ่ายของ perl จะลดลงอย่างมาก ฉันสามารถให้มอบหมายให้$_เรียกพิมพ์นัยในawk


คุณสามารถเพิ่มลิงค์ TIO (หรือคอมไพเลอร์ออนไลน์ที่คล้ายกันเพื่อทดสอบ) สำหรับแต่ละลิงก์ได้หรือไม่
Kevin Cruijssen

@KevinCruijssen เพิ่มแล้ว เอาต์พุตบน TIO สำหรับperl -pว่างเปล่าจะต้องเป็นจุดบกพร่องบน TIO
Gilles

7

> <>, Retina, Python 2: 144 127 123 ไบต์

บันทึก 1 ไบต์ด้วย @Loovjo โดยการลบช่องว่าง

บันทึก 4 ไบต์ด้วย @ mbomb007 โดยใช้inputแทนraw_input

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

โพสต์ใน TNB เป็นเรื่องที่ท้าทายฉันตัดสินใจลองชุดภาษานี้

> <>

ลองออนไลน์!

IP เริ่มเคลื่อนไปทางขวา

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

ตัวละครที่เป็นไปได้ที่จะถูกนำไปใส่เป็นPRS(ตั้งแต่โปรแกรมใช้ตัวอักษรแรกเท่านั้น) ASCII ค่าของพวกเขา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

หากอินพุตเป็นร็อคนี่คือสิ่งที่จะเกิดขึ้น:

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

มิฉะนั้นถ้าอินพุตเป็นSCISSORSหรือPAPERนี่คือสิ่งที่ 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

หากอินพุตเป็นPAPERดังนั้น:

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

มิฉะนั้น (ถ้าอินพุตเป็นSCISSORS):

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

จอตา

ลองออนไลน์!

ในกรณีนี้ Retina ถือว่าแต่ละคู่ของสองบรรทัดเป็นคู่ของการจับคู่และการทดแทน ตัวอย่างเช่นมันพยายามที่จะแทนที่สิ่งที่ตรงกับบรรทัดแรกด้วยบรรทัดที่สอง แต่เนื่องจากบรรทัดแรกไม่เคยจับคู่มันจะไม่แทนที่มันด้วยอะไรเลยดังนั้นการคงอินพุตไว้

Python 2

ลองออนไลน์!

โปรแกรม Python ต้องการอินพุตที่จะใส่ระหว่าง"s

สองบรรทัดแรกคือความคิดเห็นใน 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

ฉันไม่คิดว่าช่องว่างหลังจากprintที่บรรทัดสุดท้ายเป็นสิ่งที่จำเป็น
Loovjo

คุณสามารถใช้แทนinput() raw_input()
mbomb007

@Loovjo ขอบคุณสำหรับเคล็ดลับ :)
Kritixi Lithos

@ mbomb007 ดูเหมือนจะไม่ทำงาน
Kritixi Lithos

@KritixiLithos มันใช้งานได้ถ้าส่วนไพ ธ อนรับอินพุตด้วยเครื่องหมายคำพูด
undergroundmonorail

0

Ruby, Clojure, Lisp สามัญ - 251 ไบต์

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

รุ่นที่อ่านได้มากขึ้นพร้อมช่องว่าง:

(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 ชนะเสมอทับทิมเสมอเสมอ Common LISP จะแพ้เสมอ

สำหรับ Ruby ทุกอย่างภายใน's เป็นสตริง มันครอบคลุมทั้งสองบรรทัด จากนั้นจะใช้[]โอเปอเรเตอร์ที่มีอาร์กิวเมนต์สตริงซึ่งส่งคืนสตริงเองหากมีอยู่ในสตริง ผลลัพธ์ถูกพิมพ์ออกมา Ruby เพียงแสดงอินพุต

บรรทัดที่สองคือความคิดเห็นสำหรับ Clojure และ Common Lisp พวงevalและquoteต้องใช้เพราะ Clojure ต้องตรวจสอบให้แน่ใจว่าสัญลักษณ์ทั้งหมดถูกต้อง มันจะเป็นการดีที่จะนำรหัสกลับมาใช้ใหม่มากขึ้น แต่nthฟังก์ชั่นยังมีลายเซ็นที่แตกต่างกันในภาษาเหล่านี้ โดยทั่วไปสำหรับ Clojure if()ประเมินเป็นจริงและมันจะไปที่สาขาแรกเมื่อแฮช - แผนที่ของตัวแปรที่เป็นไปได้เรียกว่าด้วยการอ่านอาร์กิวเมนต์จาก stdin Common Lisp ไปที่สาขาที่สองจะค้นหาตำแหน่งของอาร์กิวเมนต์จาก stdin ในรายการและส่งคืนไอเท็มที่สอดคล้องกันจากรายการผลลัพธ์

ฉันเดาว่า Common LISP สามารถเล่นกอล์ฟได้มากกว่านี้

ดูออนไลน์: Ruby , Common Lisp , Clojure


0

Scala, Javascript และ Ook, 167 ไบต์

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

ทดลองใช้ใน Scala ลองใช้ใน Javascript ลองใช้ Ook เวอร์ชั่น brainfuck

สกาล่า - ชนะ

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 - แพ้

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! - ความสัมพันธ์

ส่วนของ 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

ถ้าคุณใช้แล้วคุณไม่จำเป็นต้องตั้งค่าa[(a.indexOf(s)+2)%3] a[-1]="rock"นอกจากนี้คุณไม่สามารถใส่รหัส Ook ในสตริง JavaScript ด้วยได้หรือไม่
Neil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.