คะแนนกรรไกรกระดาษหิน


70

ได้รับสองปัจจัยสตริงของ "ร็อค", "กระดาษ" หรือ "กรรไกร" กำหนดผลลัพธ์ของรอบ RPS เอาท์พุท 1 หากผู้เล่นคนแรกชนะ -1 หากผู้เล่นคนที่สองชนะหรือ 0 สำหรับการเสมอ

Rock Rock -> 0
Rock Paper -> -1
Rock Scissors -> 1
Paper Rock -> 1
Paper Paper -> 0
Paper Scissors -> -1
Scissors Rock -> -1
Scissors Paper -> 1
Scissors Scissors -> 0

คุณต้องใช้สตริง "Rock", "Paper" และ "Scissors" ที่แน่นอนเป็นอินพุต คุณสามารถเลือกได้ว่าจะให้ผู้เล่นคนแรกเลือก (อย่างสม่ำเสมอ) เป็นครั้งแรกหรือครั้งที่สอง คุณสามารถเลือกใช้เป็นอินพุตเดี่ยวที่มีตัวคั่นเดี่ยวหรือว่างเปล่าก็ได้ อินพุตถูกรับประกันหนึ่งใน 9 คู่ที่เป็นไปได้ของสามตัวเลือกในรูปแบบอินพุตของคุณ

เอาต์พุตควรเป็นตัวเลข 1, 0 หรือ -1 หรือการแทนสตริง ลอยได้ดี ดังนั้น+1, และ+0,-0

ที่เกี่ยวข้อง: การเข้ารหัสเกม RPS


ลีดเดอร์บอร์ด:


ไม่ใส่เดียวที่มีตัวคั่นที่ว่างเปล่าหมายถึงตัวอย่างเช่น "Rockpaper"?
Emigna

1
@Emigna ใช่ RockPaperแต่ถือเป็น
xnor

15
นั่นคือวิธีสนุกกว่าที่ฉันคาดไว้เจ้านายของฉันมีวิธีเด็ด ๆ ในการทำเช่นนี้
Magic Octopus Urn

อินพุตสามารถเป็นอาร์เรย์ของสองสตริงได้หรือไม่?
Luis Mendo

@LuisMendo ใช่
xnor

คำตอบ:


73

Groovy, 67 56 50 Bytes

{a,b->Math.sin(1.3*((int)b[0]-(int)a[0])).round()}

ลองออนไลน์!

ปรากฎว่าเกมกรรไกรหินกระดาษมีคุณสมบัติที่น่าสนใจ
รับสาย a และ b รับตัวอักษรตัวแรกของแต่ละตัวซึ่งจะให้ผลลัพธ์สองข้อต่อไปนี้R,P,S

รายการที่ครบถ้วนของค่าที่เป็นไปได้คือ (เมื่อรวม 2 ตัวเลือก):

XX=ASCII=Y=Wanted output
RR=82-82=0=0
PP=80-80=0=0
SS=83-83=0=0
RS=82-83=-1=1
RP=82-80=2=-1
PS=80-83=-3=-1
PR=80-82=-2=1
SR=83-82=1=-1
SP=83-80=3=1

จัดระเบียบรายการใหม่เป็น:

-3->-1
-2->1
-1->1
0->0
1->-1
2->-1
3->1

ทำให้เรามีลำดับที่มีลักษณะเป็นไซนัสผกผันและคุณสามารถแสดงสูตรนี้โดยประมาณ (และโดยประมาณฉันหมายถึงแทบไม่พอที่จะทำงานคุณสามารถได้รับสมการที่ตายแล้ว แต่มีค่าใช้จ่ายมากกว่าไบต์):

-sin((4*a[0]-b[0])/PI).roundNearest() = sin(1.3*(b[0]-a[0])).roundNearest()

แนะนำให้ลดความเรียบง่ายของ 4 / pi ถึง 1.3 เป็นครั้งแรกโดย@flawrจากนั้นทดสอบโดย@titusเพื่อประหยัดเงินทั้งหมด 6 ไบต์

คำอธิบายสมการ

การใช้คุณสมบัติการปัดเศษแบบสองทิศทางของ Groovy ทำให้ได้ผลลัพธ์ที่ถูกต้องสำหรับกรรไกรกระดาษร็อค


05AB1E , 10 ไบต์ (ไม่แข่งขัน)

Ç¥13T/*.½ò

ลองออนไลน์!

คำตอบเดียวกันนี้ถูกย้ายไปที่ 05AB1E โดยใช้คำสั่งใหม่ที่เพิ่ม 10/26/2017


3
ไม่สามารถให้คุณให้สั้นลงโดยใช้ที่-sin(x) = sin(-x)นั่นหมายความว่าเพียงแค่การกลับคำสั่งของaและbและวางชั้นนำ-? อื่น ๆ กว่าที่ hardcoding ประมาณของ4/Piเช่น1.273อาจจะเพียงพอหรือ1.3หรือหรือ9/7 5/4
ข้อบกพร่อง

2
PS: ผมยังแนะนำให้ทำลิงก์ไปยังลองออนไลน์เพื่อให้คนอย่างฉันสามารถเล่นรอบกับการส่งของคุณ =)
flawr

3
คุณสามารถบันทึก 1 ไบต์กับแทนsin(b-a) -sin(a-b)เยี่ยมมาก!
ติตัส

2
บันทึกอีก 7 ไบต์ด้วยการคูณด้วย1.3แทนที่จะเป็น4/Math.PI; นั่นก็เพียงพอแล้ว
ติตัส

1
@carusocomputingXX=ASCII=Y=Wanted output RR=82-82=0=0 PP=83-83=0=0 SS=80-80=0=0
CraigR8806

44

C, 50 35 ไบต์

#define f(i)*(short*)(i+7)%51%4%3-1

โทรfด้วยสายที่มีผู้เล่นทั้งสองโดยไม่มีตัวคั่นและมันจะกลับมาว่าคนแรกชนะ

คำอธิบาย:

โดยการดูที่เก้าสายที่เป็นไปได้ปรากฎว่าตัวอักษรคู่ในคอลัมน์ 7 และ 8 เป็นเอกลักษณ์:

       vv
RockPaper
PaperScissors
ScissorsRock
RockRock         // Sneakily taking advantage of the terminating zero
PaperPaper
ScissorsScissors
RockScissors
PaperRock
ScissorsPaper
       ^^

อ็อฟเซ็ตและดุร้ายใช้เพื่อshort*ดึงตัวอักษรคู่เหล่านี้และตีความมันเป็นตัวเลข:

29285
29545
21107
107
25968
21363
29555
27491
20595

จากนั้นมันเป็นเรื่องของแรงเดรัจฉานในการค้นหา51และ4ส่วนที่เหลือซึ่งใช้ลดจำนวนเหล่านี้เป็น:

3 0 0 1 1 1 2 2 2

ซึ่งเป็นเพียงที่สมบูรณ์แบบที่จะตะปูยังเหลืออีกส่วนในตอนท้ายและชดเชยผล

ดูมันสดบน Coliru


เพียงแค่ไม่ทำอะไรเลยเช่นการคำนวณ-f(i)เพื่อคำนวณคะแนนของผู้เล่นคนอื่น - ผลลัพธ์ที่ไม่คาดคิดจะเกิดขึ้น!
nneonneo

4
@neonneo -(f(i))ควรทำงานได้ดี แมโครสนุก!
nwp

18

MATLAB / Octave , 63 54 52 ไบต์

มันจะสะดวกมากว่า ASCII รหัสของตัวอักษรตัวแรกของเป็นRock,Paper,Scissors R=82,P=80,S=83หากเราลบ79เราจะได้สิ่งอำนวยความสะดวก3,1,4ซึ่งเราจะใช้เป็นดัชนีเมทริกซ์ในตอนนี้ 4x4 เมทริกซ์นั้นเป็นฮาร์ดโค้ดซึ่งi,jรายการ -th สอดคล้องกับผลลัพธ์หากคุณเสียบค่าจากก่อนหน้านี้:

     1   2   3   4
  +---------------
1 |  0   0   1  -1
2 |  0   0   0   0
3 | -1   0   0   1
4 |  1   0  -1   0
A(5,5)=0;A(4:7:18)=1;A=A-A';@(x,y)A(x(1)-79,y(1)-79)

ลองออนไลน์!


16

Pure Bash, 31

สูตรการยืม@ Dennis :

a=$1$1$2
echo $[(${#a}^67)%3-1]

ลองมันออนไลน์


คำตอบก่อนหน้า:

Pure Bash, 43 35

echo $[(7+(${#2}^3)-(${#1}^3))%3-1]
  • ได้รับความยาวสายของแต่ละหาเรื่อง ( 4, 5, 8ตามลำดับสำหรับร็อค, กระดาษ, กรรไกร)
  • แฮคเกอร์แต่ละคนมี 3 เพื่อให้7, 6, 11(ซึ่งเมื่อนำมาพอควร 3 ให้1, 0, 2)

  • จากนั้นลบและเล่นซอกับ mod 3 เพื่อให้ได้ผลลัพธ์ที่ต้องการ

ลองมันออนไลน์


15

งูหลาม , 40 30 ไบต์

lambda x,y:(len(2*x+y)^67)%3-1

ลองออนไลน์!

พื้นหลัง

ฉันเริ่มต้นด้วยแม่แบบฟังก์ชั่น

lambda x,y:(len(a*x+b*y)^c)%d-e

และทำการค้นหาพารามิเตอร์ที่เหมาะสมโดยใช้โปรแกรมต่อไปนี้จากนั้นเลือกพารามิเตอร์ที่มีความยาวน้อยที่สุด

RPS = 'Rock Paper Scissors'.split()
g = lambda x,y:2-(94>>len(6*x+y)%7)%4
r = range(1,10)
R = range(100)

def f(a, b, c, d, e):
    h = lambda x,y:(len(a*x+b*y)^c)%d-e
    return all(g(x, y) == h(x, y) for x in RPS for y in RPS)

[
    print('%2d ' * 5 % (a, b, c, d, e))
    for e in r
    for d in r
    for c in R
    for b in r
    for a in r
    if f(a, b, c, d, e)
]

ลองออนไลน์!


14

Mathematica ขนาด 32 ไบต์

Mod[{1,-1}.(Length/@#-3)!,3,-1]&

ฟังก์ชั่นที่ไม่มีชื่อการสั่งซื้อคู่ของรายการของตัวละครเช่นและกลับ{{"R","o","c","k"},{"P","a","p","e","r"}}-1|0|1

ผมอยากรหัสเพื่อหลีกเลี่ยงไม่ได้เป็นเพียงคำอินพุตสาม แต่ยังชื่อฟังก์ชันทางยาวเกินไปToCharacterCode; ดังนั้นฉันจึงทำงานกับความยาว4,5,8ของคำที่ป้อนแทนและมองหาฟังก์ชั่นสั้น ๆ ของความยาวที่ให้คำตอบที่ชัดเจนแบบโมดูโล 3 (การแบ่งจำนวนเต็ม 2 คูณ 2 มีแนวโน้มทางคณิตศาสตร์ แต่ฟังก์ชันเหล่านั้นมีชื่อยาวเกินไปใน Mathematica)

ปรากฎว่าการใช้แฟกทอเรียลของ (ความยาว - 3) ให้คำตอบ1,2,120ซึ่งก็คือ1,-1,0โมดูโล 3 จากนั้นเราก็คำนวณ, โมดูโล่ 3, ความแตกต่างของสองค่า (ผ่านจุดผลิตภัณฑ์{1,-1}.{x,y} = x-yซึ่งเป็นวิธีที่ดีเมื่อ สองค่าอยู่ในรายการ)


1
"ปรากฎว่า ... " คุณมีตาสำหรับสิ่งเหล่านี้
ngenisis

12

Ruby, 36 35 30 ไบต์

a=->a,b{(a+b)[12]?a<=>b:b<=>a}

ลองใช้บน ideone.com

ผลการทดสอบ:

a=->a,b{(a+b)[12]?a<=>b:b<=>a}

puts a.call("Rock", "Rock")
puts a.call("Rock", "Paper")
puts a.call("Rock", "Scissors")
puts a.call("Paper", "Rock")
puts a.call("Paper", "Paper")
puts a.call("Paper", "Scissors")
puts a.call("Scissors", "Rock")
puts a.call("Scissors", "Paper")
puts a.call("Scissors", "Scissors")

0
-1
1
1
0
-1
-1
1
0

ใช้ประโยชน์จากความจริงที่ว่า 7 จาก 9 ผลลัพธ์ที่ถูกต้องจะถูกสร้างขึ้นโดยการทำเปรียบเทียบ lexicographic <=>ใช้ประกอบการยานอวกาศ (a+b)[12]เพียงฝืนปัจจัยการผลิตเพื่อการเปรียบเทียบถ้า input PaperและScissors(และยังScissors Scissors- แต่ที่0ทางใดทางหนึ่งรอบ)

ด้วยความขอบคุณจากHorváthDávidที่ช่วยฉันให้รอดพ้นตัวละครและขอบคุณ GB ที่ช่วยฉันอีก 5 คน


คุณสามารถใช้แลมบ์ดานิรนามและบันทึกได้ 2 ตัวอักษร
GB

@GB หากฉันไม่ได้ตั้งชื่อฟังก์ชั่นฉันควรจะเรียกมันยังไง? smacks ของการโกงกับฉัน แต่ขอบคุณสำหรับเคล็ดลับอื่น ๆ - ฉันได้ดูที่ แต่ปฏิเสธมันเพราะ ScissorsScissors คือ 16 แต่ฉันเห็นว่ามันไม่สำคัญ :-)
Gareth


@Dennis คุณไม่สามารถโทรหาได้หากไม่ได้กำหนดไว้ รู้สึกเหมือนกำลังนอกใจฉันและไม่ยุติธรรมกับภาษาที่ไม่มีฟังก์ชั่นนิรนามที่ต้องกำหนดชื่อ
Gareth

แน่นอนว่าคุณสามารถ tio.run/nexus/…
Dennis

10

Python , 39 36 34 33 ไบต์

lambda x,y:2-(94>>len(6*x+y)%7)%4

ลองออนไลน์!

มันทำงานอย่างไร

ลองมาดูที่ค่าไม่กี่ของความยาวของหกสำเนาของxและสำเนาของYโมดูโล7

                                l(x,y) =:
x        y        len(x) len(y) len(6*x+y)%7
--------------------------------------------
Rock     Rock          4      4            0
Rock     Paper         4      5            1
Rock     Scissors      4      8            4
Paper    Rock          5      4            6
Paper    Paper         5      5            0
Paper    Scissors      5      8            3
Scissors Rock          8      4            3
Scissors Paper         8      5            4
Scissors Scissors      8      8            0

เราสามารถเข้ารหัสผลลัพธ์ ( {-1, 0, 1} ) โดยการทำแผนที่พวกเขาเข้าไปในชุด{0, 1, 2, 3} ตัวอย่างเช่นการทำแผนที่t ↦ 2 - tบรรลุผลสำเร็จและเป็นสิ่งที่ตรงกันข้าม

ขอแสดงผลของxและy ที่โดยo (x, y) แล้ว:

x        y        l(x,y) o(x,y) 2-o(x,y) (2-o(x,y))<<l(x,y)
-----------------------------------------------------------
Rock     Rock          0      0        2                10₂
Rock     Paper         1     -1        3               110₂
Rock     Scissors      4      1        1            010000₂
Paper    Rock          6      1        1          01000000₂
Paper    Paper         0      0        2                10₂
Paper    Scissors      3     -1        3             11000₂
Scissors Rock          3     -1        3             11000₂
Scissors Paper         4      1        1            010000₂
Scissors Scissors      0      0        2                10₂

โชคดีที่บิตในคอลัมน์สุดท้ายทั้งหมดเห็นด้วยกันดังนั้นเราจึงสามารถหรือให้เป็นจำนวนเต็มหนึ่งnและดึงo (x, y)เป็น2 - ((n≫ o (x, y))% 4) . ค่าของnคือ94


9

เรติน่า , 35 31 ไบต์

G`k P|r S|s R
*\)`.+
-
D`\w+
 .

ลองออนไลน์!

คำอธิบาย

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

G`k P|r S|s R
*\)`.+
-

นี่คือสองขั้นตอน )ในสองกลุ่มเวทีพวกเขาร่วมกันที่*ทำให้พวกเขาวิ่งแห้ง (ซึ่งหมายความว่าสายป้อนจะถูกเรียกคืนหลังจากที่พวกเขาถูกประมวลผล แต่ผลที่ได้จะถูกพิมพ์) และ\ยับยั้งการพิมพ์ของเลื่อนบรรทัดต่อท้าย สองขั้นตอนพร้อมกันจะพิมพ์ a -ถ้ามี

ขั้นตอนแรกเป็นGขั้นตอนตัวแทนซึ่งเพียง แต่ช่วยให้เส้นถ้ามีอย่างใดอย่างหนึ่งk P, หรือr S เหล่านี้สอดคล้องกับกรณีที่เราต้องเอาท์พุทs R -1หากไม่ใช่กรณีเหล่านี้อินพุตจะถูกแทนที่ด้วยสตริงว่าง

ขั้นตอนที่สองแทนที่.+(สตริงทั้งหมด แต่ถ้ามันมีอย่างน้อยหนึ่งตัวอักษร) -กับ ดังนั้นนี่จะพิมพ์-สำหรับสามกรณีและไม่มีอะไรเป็นอย่างอื่น

D`\w+
 .

นี่คืออีกสองขั้นตอน ขั้นตอนแรกคือการทำDสำเนา มันจับคู่คำและลบรายการที่ซ้ำกัน ดังนั้นถ้าหากอินพุตนั้นเสมอกันจะลดคำที่สองลงไป

ขั้นตอนที่สองนับจำนวนการแข่งขันของ .ซึ่งเป็นช่องว่างตามด้วยตัวละครใด ๆ หากอินพุตเป็นเน็คไทและคำที่สองถูกลบออกผลลัพธ์จะ0เป็น มิฉะนั้นคำที่สองยังคงอยู่และมีหนึ่งตรงกันดังนั้นจึงพิมพ์ออกมา1แทน


นี่คือวิธีการที่แตกต่างกันตามความยาวของสตริงอินพุต มันยาวกว่าของคุณ แต่ฉันสงสัยว่ามันจะลงกอล์ฟได้อีกไหม?
บาดเจ็บทางระบบดิจิตอล

@ DigitalTrauma มันเป็นความคิดที่เรียบร้อยจริงๆ แต่ฉันไม่เห็นอะไรที่จะทำให้สั้นลง ฉันคิดว่าคุณควรโพสต์ไว้ต่อไป (และถ้าคุณย้ายบรรทัดแรกไปที่ส่วนหัว TIO จะไม่รวมในจำนวนไบต์)
Martin Ender

8

05AB1E , 18 17 15 10 9 ไบต์

บันทึก 6 ไบต์ด้วยเคล็ดลับความยาวอินพุตของ Digital Trauma

€g3^Æ>3%<

ใช้อินพุตเป็น [SecondPlayersChoice,FirstPlayersChoice]

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

โซลูชันทางเลือก 9 ไบต์: íø¬ÇÆ>3%<

คำอธิบาย

€g          # length of each in input
  3^        # xor 3
    Æ       # reduce by subtraction
     >      # increment
      3%    # modulus 3
        <   # decrement

โซลูชัน 15 ไบต์ก่อนหน้า

A-D{„PSÊiR}Ç`.S

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

 A-               # remove the lowercase alphabet from the input (leaves a 2 char string)
   D{             # sort a copy of the leftover
     „PSÊ         # check if the copy isn't "PS" (our special case)
         iR}      # if true, reverse the string to get the correct sign
            Ç`    # convert the two letters to their character codes
              .S  # compare their values

คุณเอาชนะความสนุกของฉัน :( Ç¥13T/*.½òทำไมมันจึงเป็นเช่นนั้นไม่มีใครรู้
Magic Octopus Urn

@ MagicOctopusUrn: Uuuh แน่ใจว่าเป็นสิ่งที่แปลก รูปแบบการป้อนข้อมูลจะเป็นอย่างไรเพื่อให้คืนค่า int เป็นเอาต์พุต
Emigna


@MagicOctopusUrn: ใช่แล้วฉันลืมเรื่องนั้นไป คำตอบที่ฉันชอบความท้าทายนี้ :)
Emigna

6

เยลลี่ขนาด 8 ไบต์

L€Iµ-*×Ṡ

ลองออนไลน์! (ชุดทดสอบปลดมันเป็นจำนวนเต็มเพื่อความชัดเจน)

มันทำงานอย่างไร

L€Iµ-*×Ṡ  Main link. Argument: A (string array)

L€        Take the length of each string.
  I       Increments; compute the forward difference of the length.
   µ      Begin a new chain with the difference d as argument.
    -*    Compute (-1)**d.
      ×Ṡ  Multiply the result with the sign of d.

6

Python 2 , 46 40 ไบต์

lambda x,y:+(x!=y,-1)[x[0]+y[0]in'RPSR']

ลองออนไลน์!

ด้วยความขอบคุณอย่างมากที่ @Dennis ที่ให้ฉันยืมรหัสทดสอบแบบทดสอบออนไลน์ของเขาและเพื่อช่วยฉัน 6 ไบต์

แก้ไข

@ hashcode55 - สวยมากตามที่คุณอธิบาย (x! = y, -1) เป็นลำดับสององค์ประกอบและ [x [0] + y [0] in'RPSR '] คือการคำนวณองค์ประกอบที่จะใช้ หากตัวอักษรตัวแรกของ x + ตัวอักษรตัวแรกของ y อยู่ในรายการตัวอักษรมันจะประเมินเป็น True หรือ 1 ดังนั้น (x! = y, -1) [1] จะถูกส่งกลับ ถ้าไม่ใช่ (x! = y, -1) [0] นี่คือที่ที่มันจะยุ่งยากเล็กน้อย องค์ประกอบแรกอยู่ในตัวเองอย่างมีประสิทธิภาพอีกถ้า ถ้า x! = y ดังนั้นองค์ประกอบแรกจะเป็นจริงมิฉะนั้นจะเป็นเท็จดังนั้นหาก x [0] + y [0] in'RPSR 'เป็นเท็จดังนั้น True หรือ False จะถูกส่งกลับขึ้นอยู่กับว่า x == y เครื่องหมาย + ค่อนข้างลับ ๆ ล่อ ๆ และขอขอบคุณ @Dennis อีกครั้งสำหรับสิ่งนี้ x! = y จะคืนค่าจริงหรือเท็จตามตัวอักษร เราต้องการ 1 หรือ 0 ฉันยังไม่ค่อยทราบว่า + จะแปลงนี้อย่างไร ฉันสามารถสันนิษฐานได้ว่าโดยการใช้ตัวดำเนินการทางคณิตศาสตร์กับ True / False มันบังคับให้มันถูกมองว่าเป็นจำนวนเต็มเทียบเท่า เห็นได้ชัดว่า + ด้านหน้าของ -1 จะยังคงกลับ -1

หวังว่านี่จะช่วยได้!


Hi! คุณช่วยบอกฉันหน่อยได้ไหมว่าซินแทกซ์นี้ทำงานอย่างไร? เหตุผลคาดเดา(x!=y,-1)นี้คือการทำงานเช่นถ้าหากรายการสร้างจริงแล้ว -1 x!=yอื่น การใช้+สัญลักษณ์นั้นคืออะไร? แหล่งที่มาของการบันทึกไวยากรณ์ประเภทนี้จะเป็นประโยชน์จริง ๆ !
hashcode55

@ hashcode55 - ฉันได้เพิ่มคำอธิบายลงในคำตอบแล้ว
ElPedro

เพื่อตอบคำถามที่ไม่แน่นอนของคุณเกี่ยวกับ+- ในกรณีนี้นั่นคือข้อดีและเหมือน+10กันและเป็นวิธีสั้น ๆ ในการแปลงเป็นจำนวนเต็ม
FlipTack

ขอบคุณ @FlipTack คินเดาว่านั่นคือสิ่งที่มันทำ แต่ขอบคุณสำหรับคำอธิบายที่เหมาะสม
ElPedro

@ElPedro ขอบคุณมาก! นั่นช่วยฉันได้จริงๆ
hashcode55

5

JavaScript (ES6), 46 38 ไบต์

(a,b)=>(4+!b[4]+!b[5]-!a[4]-!a[5])%3-1

ทำให้การใช้ความจริงที่ว่า Rock-Paper-Scissors เป็นวงจร JavaScript ไม่มีทั้งยานอวกาศและผู้ประกอบการที่สมดุลย์มิฉะนั้นคำตอบก็(a,b)=>((b<=>'Rock')-(a<=>'Rock'))%%3คือ

แก้ไข: บันทึกแล้ว 8 ไบต์ด้วย @WashingtonGuedes


1
@ WashingtonGuedes ฉันสามารถทำได้ดีกว่านั้น!
Neil

คุณสามารถ
ล้าง

ฉันลองใช้มันและส่งคืน 0 เสมอ
Vitim.us

5

MATL , 14 13 ไบต์

TTt_0vic1Z)d)

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

หากรหัส ASCII ของตัวอักษรเริ่มต้นของสตริงแรกถูกลบออกจากสตริงที่สองเราจะได้รับค่าในคอลัมน์Dด้านล่าง การโมดูโล 5 ให้ค่าM ค่าสุดท้ายในวงเล็บเป็นผลที่ต้องการ R

                        D        M     R
                       ---      ---   ---
Rock Rock          ->   0   ->   0   ( 0) 
Rock Paper         ->  −2   ->   3   (−1)
Rock Scissors      ->   1   ->   1   ( 1)
Paper Rock         ->   2   ->   2   ( 1)
Paper Paper        ->   0   ->   0   ( 0)
Paper Scissors     ->   3   ->   3   (−1)
Scissors Rock      ->  −1   ->   4   (−1)
Scissors Paper     ->  −3   ->   2   ( 1)
Scissors Scissors  ->   0   ->   0   ( 0)

ดังนั้นถ้าเราคำนวณDแล้วMเพื่อให้ได้Rเราจำเป็นต้องแมป 0 ถึง 0 เท่านั้น 1 และ 2 ต่อ 1; 3 และ 4 ถึง −1 ซึ่งสามารถทำได้โดยการจัดทำดัชนีในอาร์เรย์ของห้ารายการเท่ากับ 0, 1 หรือ −1 เนื่องจากการจัดทำดัชนีใน MATL เป็นแบบ 1 และโมดูลาร์อาเรย์ควรเป็น[1, 1, −1, −1, 0](รายการแรกมีดัชนี 1, สุดท้ายมีดัชนี 5 หรือเทียบเท่า 0) ในที่สุดการดำเนินการ modulo 5 สามารถหลีกเลี่ยงโชคดีเพราะมันจะถูกดำเนินการโดยการทำดัชนีโดยปริยาย

TT     % Push [1 1]
t_     % Duplicate, negate: pushes [−1 −1]
0      % Push 0
v      % Concatenate vertically into the 5×1 array [1; 1; −1; −1; 0]
i      % Input cell array of strings
c      % Convert to 2D char array, right-padding with zeros if necessary
1Z)    % Take the first column. Gives a 2×1 array of the initial letters
d      % Difference
)      % Index into array. Implicit display

5

CJam , 12 ไบต์

0XXWW]rcrc-=

อินพุตทั้งสองถูกคั่นด้วยช่องว่าง คำสั่งซื้อของพวกเขากลับรายการด้วยความเคารพในข้อความท้าทาย

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

แปลของฉันคำตอบ MATL วิธีนี้ใช้ประโยชน์จากความจริงที่ว่าใน CJam c(แปลงเป็นถ่าน) ที่ใช้กับสตริงใช้อักขระตัวแรก นอกจากนี้อาร์เรย์สำหรับการแมปจะแตกต่างกันเนื่องจากการจัดทำดัชนีใน CJam นั้นเป็นแบบ 0

0XXWW    e# Push 0, 1, 1, -1, -1
]        e# Pack into an array
rc       e# Read whitespace-separated token as a string, and take its first char
rc       e# Again
-        e# Subtract code points of characters
=        e# Index into array. Implicitly display

5

CJam, 15 14 12 ไบต์

rW=rW=-J+3%(

ใช้รหัส ascii ของอักขระตัวสุดท้ายของแต่ละสตริงจากนั้นส่งคืน:

(a1 - a2 + 19) % 3 - 1

ทดสอบที่นี่ !



4

Java 7, 82 ไบต์

int c(String...a){int x=(a[0].charAt(1)-a[1].charAt(1))%5/2;return x%2==x?x:x/-2;}

Ungolfed:

int c(String... a){
   int x = (a[0].charAt(1) - a[1].charAt(1)) % 5 / 2;
   return x%2 == x
           ? x
           : x / -2;
}

คำอธิบาย:

  • ตัวอักษรที่สองo, aและcมีทศนิยมแอสกี111, และ9799
  • หากเราลบสิ่งเหล่านี้ออกจากกันสำหรับกรณีทดสอบเราจะได้ผลลัพธ์ดังนี้:
    • 0 (ร็อคร็อค)
    • 14 (หินกระดาษ)
    • 12 (กระดาษกรรไกร)
    • -14 (กระดาษร็อค)
    • 0 (กระดาษกระดาษ)
    • -2 (กระดาษกรรไกร)
    • -2 (กรรไกร, ร็อค)
    • 2 (กรรไกรกระดาษ)
    • 0 (กรรไกรกรรไกร)
  • ถ้าเราใช้แบบโมดูโล 5 สำหรับแต่ละที่เราได้รับ4, 2, -4, -2, ,-22
  • หารด้วย 2 xตอนนี้เป็นกรณีทดสอบต่อไปนี้:
    • x = 0 (ร็อคร็อค)
    • x = 2 (ร็อค, กระดาษ)
    • x = 1 (กระดาษกรรไกร)
    • x = -2 (กระดาษร็อค)
    • x = 0 (กระดาษ, กระดาษ)
    • x = -1 (กระดาษกรรไกร)
    • x = -1 (กรรไกร, ร็อค)
    • x = 1 (กรรไกรกระดาษ)
    • x = 0 (กรรไกร, กรรไกร)
  • เฉพาะ2และ-2ไม่ถูกต้องและควรได้รับ-1และ1แทน ดังนั้นหากx%2 != x(ทุกอย่างสูง1หรือต่ำกว่า-1) เราหารด้วย-2เพื่อแก้ไข 'edge-cases' ทั้งสองนี้

รหัสทดสอบ:

ลองที่นี่

class M{
  static int c(String...a){int x=(a[0].charAt(1)-a[1].charAt(1))%5/2;return x%2==x?x:x/-2;}

  public static void main(String[] a){
    String R = "Rock",
           P = "Paper",
           S = "Scissors";
    System.out.println(c(R, R)); // 0
    System.out.println(c(R, P)); // -1
    System.out.println(c(R, S)); // 1
    System.out.println(c(P, R)); // 1
    System.out.println(c(P, P)); // 0
    System.out.println(c(P, S)); // -1
    System.out.println(c(S, R)); // -1
    System.out.println(c(S, P)); // 1
    System.out.println(c(S, S)); // 0
  }
}

เอาท์พุท:

0
-1
1
1
0
-1
-1
1
0

ทำไมจดหมายฉบับที่สองถึงอยากรู้อยากเห็น? ฉันมีวิธีการแบบเดียวกัน (kinda) แต่ใช้ตัวอักษรตัวแรก
Magic Octopus Urn

@carusocomputing ดีฉันสังเกตเห็นว่าคนอื่น ๆ ส่วนใหญ่ใช้ตัวอักษรตัวแรกหรือความยาวและต้องการลองอย่างอื่น ครั้งแรกที่ผมใช้ตัวอักษรสาม ( c, p, i) ที่มีค่าแอสกี99, 112และ105ขณะที่พวกเขาดูเหมือนมีประโยชน์มากที่สุดและสังเกตเห็นมันจะกลายเป็น 4, 2, 0 ถ้าฉันไม่โมดูโล 5. เท่านั้นแล้วฉันคิดว่าฉันจะต้องลบทั้งดังนั้น 4, 2 และ 0 ไม่ได้ใช้งานมากนัก หลังจากลองเล่นไปรอบ ๆ / ลองผิดลองถูกตัวอักษรตัวที่สองและได้รับผลลัพธ์ที่เป็นประโยชน์มากขึ้นโดยที่โมดูโล 5 ยังคงปรากฏอยู่ จากนั้นฉันก็รีบมาหาทางออกที่ฉันนำเสนอข้างต้น :)
Kevin Cruijssen

@carusocomputing ต้องการลองใช้วิธีการที่เป็นเอกลักษณ์และพิจารณาว่าฉันค่อนข้างแย่ในการแก้ปัญหาแบบนี้มันไม่ได้สั้นเหมือนกับโซลูชันอื่น ๆ แต่ยังคงมีเอกลักษณ์ (ซึ่งเป็นเป้าหมายแรกของฉัน) :)
Kevin Cruijssen

4

dc, 18

1?Z9+2/rZ1+2/-3%-p

ลองมันออนไลน์

โปรดทราบว่าทั้งสอง args ถูกส่งผ่าน (คั่นด้วยช่องว่าง) ในหนึ่งบรรทัดไปยัง STDIN args มีอยู่ในเครื่องหมายวงเล็บเหลี่ยม[ ]เนื่องจากเป็นวิธีที่dcชอบสตริง

dcมีการจัดการสตริงที่ จำกัดมากแต่กลับกลายเป็นหนึ่งในสิ่งที่คุณสามารถทำได้คือใช้Zคำสั่งเพื่อรับความยาวสตริงซึ่งโชคดีที่แตกต่างกันสำหรับ "ร็อค", "กระดาษ" และ "กรรไกร" และสามารถค่อนข้างง่ายทางคณิตศาสตร์ จัดการเพื่อให้ผลลัพธ์ที่ต้องการ




3

C #, 85 84 ไบต์

บันทึก 1 ไบต์ต้องขอบคุณ TheLethalCoder

a=>b=>a==b?0:(a[0]=='R'&b[0]=='S')|(a[0]=='P'&b[0]=='R')|(a[0]=='S'&b[0]=='P')?1:-1;

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


บันทึกหนึ่งไบต์โดยใช้ currying iea=>b=>...
TheLethalCoder

3

JavaScript, 37 , 32 , 31 ไบต์

a=>b=>a==b?0:!(a+b)[12]^a>b||-1

ถ้า a เท่ากับ b เอาท์พุทเป็นศูนย์

มิฉะนั้นผลของการตรวจสอบ xor ถ้าความยาวไม่เกิน 12 (เปรียบเทียบกรรไกรและกระดาษ) กับการเปรียบเทียบมากกว่า b
หากสิ่งนี้คืนค่า 1 ให้ส่งคืน

ถ้ามันคืนค่า 0 ให้ใช้ตัวดำเนินการ OR เพื่อแทนที่ด้วย -1


คุณสามารถเขียนสิ่งนี้เป็นฟังก์ชั่น curried a=>b=>เพื่อบันทึก byte หรือไม่?
FlipTack

ใช่. ขอบคุณ @FlipTack
Grax32


2

Perl, 33 ไบต์

32 ไบต์ของรหัส + -pธง

$_=/(.+) \1/?0:-/k P|r S|s R/||1

วิธีเรียกใช้:

perl -pe '$_=/(.+) \1/?0:-/k P|r S|s R/||1' <<< "Rock Paper"

ที่บันทึกไว้ 3 ไบต์โดยใช้ regex ของจอประสาทตามาร์ตินเอนเดอร์ของคำตอบ (regex ก่อนหน้าของฉันคือ/R.*P|P.*S|S.*R/)

คำอธิบาย:

ขั้นแรกให้ตรวจสอบว่าการป้อนข้อมูลที่มีสองคำเดียวกันถ้าเป็นเช่นนั้นผลที่ได้คือ/(.+) \1/ 0มิฉะนั้นเกี่ยวข้องกับกรณีที่คำตอบคือ/k P|r S|s R/ -1หากนี่ regex สุดท้ายคือเท็จแล้วเป็นเท็จเพื่อให้เรากลับมา-/k P|r S|s R/1


2

เยลลี่ขนาด 9 ไบต์

L€^3Iæ%1.

นี้ใช้อัลกอริทึมจาก@ คำตอบทุบตี

ลองออนไลน์!

มันทำงานอย่างไร

L€^3Iæ%1.  Main link. Argument: A (string array)

L€         Take the length of each string.
  ^3       XOR the lengths bitwise with 3.
    I      Increments; compute the forward difference of both results.
     æ%1.  Balanced modulo 1.5; map the results into the interval (-1.5, 1.5].

Dammit ฉันกำลังจะเริ่มอ่านข้อมูลเกี่ยวกับ Jelly โอ้ดีนี่มันอยู่ใน pyth +1
บาดเจ็บทางดิจิตอล

2

Japt , 19 ไบต์

-Ms(4*(Uc -Vc)/MP¹r

ลองที่นี่!

แรงบันดาลใจจากโซลูชันของ carusocomputing

โซลูชัน 53 ไบต์เก่า

W=Ug c X=Vg c W¥X?0:W¥82©X¥83?1:W¥80©X¥82?1:W¥83©X¥80?1:J

ลองออนไลน์!

ขอบคุณอีกครั้ง ETHproductions!


1
คุณสามารถเริ่มต้นโดยใช้©แทนการ&&เปลี่ยนUg0 cไปUg c(เช่นเดียวกับV) และแทนที่ด้วย-1 Jมันยังคงค่อนข้างนานกว่าคำตอบของ JSแต่บางทีคุณสามารถนำความคิดบางอย่างจากนั้น
ETHproductions

@ ETHproductions ขอบคุณ! ฉันไม่รู้ว่าฉันลืมไปได้อย่างไร©
Oliver

1
W=Ucที่จริงคุณก็สามารถทำได้ ฉันไม่รู้ว่าทำไมฉันถึงลืมว่ามันcใช้ได้กับสตริงใด ๆ : P
ETHproductions

2

PHP, 55 53 ไบต์

<?=(3-(ord($argv[2])%6%4-ord($argv[1])%6%4+3)%3*2)%3;
  • รับค่า ascii ของตัวอักษรตัวแรก (จากอาร์กิวเมนต์บรรทัดคำสั่ง): 82,80,83
  • % 6: 4,2,5
  • % 4: 0,2,1
  • ความแตกต่าง (ba):
    • PS: 1-2, SR: 2-0, RP: 2-0 -> -1 หรือ 2; + 3,% 3 -> 2
    • SP: 2-1, RS: 0-2, PR: 0-2 -> -2 หรือ 1; + 3,% 3 -> 1
    • RR, PP, เอสเอส: 0; + 3,% 3: 0
  • (3-2 * x): -1,1,3
  • % 3: -1,1,0

รุ่นไซน์, 49 46 ไบต์

<?=2*sin(1.3*(ord($argv[2])-ord($argv[1])))|0;

พอร์ตของcarusocomputing มีคำตอบ golfed :

บันทึก 3 ไบต์โดย @ user59178


1
สำหรับรุ่นไซน์สำหรับสามารถบันทึก 3 ไบต์โดยแทนที่round(x)ด้วย2*x^0
user59178

2

Perl, 25 ไบต์

$_=/kS|rR|sP/-/kP|rS|sR/

รหัส 24 ไบต์ +1 ไบต์สำหรับ-pตัวเลือก

อินพุตควรอยู่บน stdin โดยไม่มีตัวคั่นเช่น:

echo PaperRock | perl -pe'$_=/kS|rR|sP/-/kP|rS|sR/'

regexp แรกค้นหาผู้เล่นคนแรกชนะที่สองสำหรับการสูญเสียของเขา ความแตกต่างถูกพิมพ์


1

สกาลา, 148 ไบต์

object R extends App{val t=Seq('R','P','S')
val(a,b)=(args(0)(0),args(1)(0))
print(if(a==b)0 else if(t.indexOf(a)%3==(t.indexOf(b)-1)%3)-1 else 1)}

โชคดีที่ต้องใช้เครื่องหมายอัฒภาคเพื่อแยกคำสั่งหลายคำในบรรทัดเดียวกัน Scala ได้รับประโยชน์จากการมีรหัสกอล์ฟที่สามารถจัดรูปแบบได้!

ในความพยายามตีกอล์ฟนี้ฉันรู้ว่าคุณสามารถแทนที่ได้

"somestring".charAt(index) 

กับ

"somestring"(index) 

เพราะสกาล่าช่วยให้คุณปฏิบัติกับสตริงเป็นอาร์เรย์เพื่อจุดประสงค์ในการรับตัวละคร


นี้สามารถเล่นกอล์ฟได้อย่างมาก สำหรับ starters คุณได้รับอนุญาตให้ทำหน้าที่แทนโปรแกรมที่สมบูรณ์แบบในความท้าทายส่วนใหญ่ที่นี่ดังนั้นแทนที่จะให้วัตถุทั้งหมดขยายสิ่งแอพและดึงจาก args ลองสิ่งที่ชอบ: def g (a: Seq, b: Seq) = ...
Ethan

นอกจากนี้คุณไม่จำเป็นต้องพิมพ์ค่า การกลับมาก็เพียงพอแล้วซึ่งยอดเยี่ยมเมื่อเล่นกอล์ฟสกาล่าเนื่องจากการกลับมานั้นฟรี และคุณสามารถปรับปรุงให้ดียิ่งขึ้นได้โดยใช้เคล็ดลับที่โพสต์ในคำตอบ Groovy ซึ่งทำงานได้เกือบเหมือนกันใน Scala
Ethan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.