Điểm số kéo giấy


70

Đưa ra hai đầu vào chuỗi của "Rock", "Paper" hoặc "Kéo", xác định kết quả của vòng RPS . Xuất 1 nếu người chơi thứ nhất thắng, -1 nếu người chơi thứ hai thắng hoặc 0 cho hòa.

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

Bạn phải sử dụng các chuỗi chính xác "Đá", "Giấy" và "Kéo" làm đầu vào. Bạn có thể chọn lựa chọn của người chơi đầu tiên (nhất quán) được đưa ra đầu tiên hay thứ hai. Bạn cũng có thể lấy chúng làm đầu vào đơn với một ký tự đơn hoặc dấu phân cách trống. Đầu vào được đảm bảo một trong 9 cặp có thể có của ba lựa chọn trong định dạng đầu vào của bạn.

Đầu ra phải là số 1, 0 hoặc -1 hoặc biểu diễn chuỗi của nó. Phao vẫn ổn. Vì vậy +1, +0,-0.

Liên quan: Mã hóa một trò chơi RPS


Bảng xếp hạng:


một đầu vào với dấu tách trống có nghĩa là "giấy nhám" không?
Emigna

1
@Emigna Có, nhưng viết hoa là RockPaper.
xnor

15
Đó là cách vui hơn tôi dự đoán, chúa tể của tôi có một số cách tuyệt vời để làm điều này.
Bạch tuộc ma thuật Urn

Đầu vào có thể là một mảng của hai chuỗi không?
Luis Mendo

@LuisMendo Vâng.
xnor

Câu trả lời:


73

Groovy, 67 56 50 byte

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

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

Hóa ra trò chơi đá, giấy, kéo có một tài sản khá tuyệt.
Cho các chuỗi a và b, lấy chữ cái đầu tiên của mỗi chuỗi, điều này dẫn đến hai trong số sau:R,P,S

Danh sách đầy đủ các giá trị có thể là (Khi kết hợp 2 lựa chọn):

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

Sắp xếp lại danh sách để:

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

Cung cấp cho chúng tôi một chuỗi trông ngược hình sin và bạn thực sự có thể biểu diễn công thức này xấp xỉ (và gần như tôi có nghĩa là chỉ vừa đủ để làm việc, bạn có thể có một phương trình đã chết nhưng tốn nhiều byte hơn):

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

Việc đơn giản hóa 4 / pi thành 1.3 được đề xuất trước tiên bởi @flawr và sau đó được @titus kiểm tra với tổng mức tiết kiệm là 6 byte.

Giải thích phương trình

Sử dụng các thuộc tính làm tròn gấp đôi của Groovy, điều này dẫn đến kết quả đầu ra chính xác cho kéo giấy bằng đá.


05AB1E , 10 byte (không cạnh tranh)

Ç¥13T/*.½ò

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

Câu trả lời tương tự được chuyển đến 05AB1E bằng cách sử dụng các lệnh mới được thêm vào ngày 26/10/2017.


3
Bạn không thể làm cho nó ngắn hơn bằng cách sử dụng đó -sin(x) = sin(-x), có nghĩa là chỉ đảo ngược thứ tự của abvà thả các hàng đầu -? Ngoài ra, mã hóa một xấp xỉ 4/Pigiống như 1.273có thể là đủ, 1.3hoặc 9/7hoặc 5/4.
flawr

2
Tái bút: Tôi cũng đề nghị tạo một liên kết để dùng thử trực tuyến để những người như tôi có thể chơi xung quanh với bài đăng của bạn =)
flawr

3
Bạn có thể lưu 1 byte sin(b-a)thay vì -sin(a-b). Tuyệt vời tìm thấy!
Tít

2
Lưu 7 byte khác bằng cách nhân với 1.3thay vì 4/Math.PI; mà chính xác là đủ.
Tít

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 byte

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

Gọi fvới một chuỗi chứa cả hai người chơi, không có dấu phân cách và nó sẽ trả về cho dù người đầu tiên thắng.

Giải trình:

Bằng cách nhìn vào chín chuỗi có thể, hóa ra các cặp chữ cái trên cột 7 và 8 là duy nhất:

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

Sự bù trừ và man rợ để short*lấy các cặp chữ cái này và diễn giải chúng thành các số:

29285
29545
21107
107
25968
21363
29555
27491
20595

Sau đó, đó là vấn đề vũ lực để tìm 514phần còn lại, áp dụng liên tiếp giảm những con số này thành:

3 0 0 1 1 1 2 2 2

Điều này là hoàn hảo để giải quyết một phần còn lại ở cuối, và bù đắp kết quả.

Xem nó trực tiếp trên Coliru


Chỉ cần không làm bất cứ điều gì như tính toán -f(i)để tính điểm của người chơi khác - kết quả bất ngờ sẽ xảy ra!
nneonneo

4
@nneonneo -(f(i))nên hoạt động tốt. Macro là niềm vui!
nwp

18

MATLAB / Octave , 63 54 52 byte

Điều rất thuận tiện là mã ASCII của các chữ cái đầu tiên Rock,Paper,ScissorsR=82,P=80,S=83. Nếu chúng ta trừ đi, 79chúng ta sẽ có được một cách thuận tiện 3,1,4, bây giờ chúng ta sẽ sử dụng như các chỉ số ma trận: Ở đây một ma trận 4 x 4 được mã hóa cứng, trong đó i,jmục thứ-1 tương ứng với kết quả nếu bạn cắm các giá trị từ trước đó:

     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)

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


16

Bash thuần khiết, 31

Mượn công thức của @ Dennis :

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

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


Câu trả lời trước:

Bash tinh khiết, 43 35

echo $[(7+(${#2}^3)-(${#1}^3))%3-1]
  • Lấy chiều dài chuỗi của mỗi arg ( 4, 5, 8lần lượt cho Rock, Paper, Scissors)
  • XOR mỗi 3 để cung cấp cho 7, 6, 11(mà khi lấy mod 3 Cho 1, 0, 2)

  • Sau đó trừ và fiddle với mod 3 để có được kết quả mong muốn.

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


15

Python , 40 30 byte

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

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

Lý lịch

Tôi đã bắt đầu với mẫu hàm

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

và thực hiện tìm kiếm brute-force cho các tham số phù hợp bằng chương trình sau, sau đó chọn một tham số có độ dài tối thiểu.

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

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


14

Toán học, 32 byte

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

Hàm không tên lấy một cặp danh sách các ký tự, chẳng hạn như {{"R","o","c","k"},{"P","a","p","e","r"}}và trả về -1|0|1.

Tôi muốn mã không chỉ tránh ba từ đầu vào mà còn cả tên hàm quá dài ToCharacterCode; Vì vậy, tôi đã làm việc với độ dài 4,5,8của các từ đầu vào thay vào đó và tìm kiếm một hàm ngắn của các độ dài đó đã đưa ra các câu trả lời riêng biệt modulo 3. (Phép chia số nguyên cho 2 có triển vọng về mặt toán học, nhưng các hàm đó có tên quá dài trong Mathicala.)

Hóa ra việc lấy giai thừa của (độ dài - 3) sẽ cho các câu trả lời 1,2,1201,-1,0modulo 3. Sau đó, chúng ta chỉ cần tính toán, modulo 3, sự khác biệt của hai giá trị (thông qua sản phẩm dấu chấm {1,-1}.{x,y} = x-y, một cách tốt khi hai giá trị nằm trong một danh sách).


1
"Hóa ra ..." Bạn có một mắt cho những điều này
ngenisis

12

Ruby, 36 35 30 byte

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

Dùng thử trên ideone.com

Đầu ra thử nghiệm:

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

Lợi dụng thực tế là 7 trong số 9 kết quả chính xác được tạo ra chỉ bằng cách thực hiện so sánh từ điển bằng cách sử dụng toán tử tàu vũ trụ <=>. Chỉ (a+b)[12]cần đảo ngược các đầu vào để so sánh nếu các đầu vào là PaperScissors(và cũng có thể Scissors Scissors- nhưng đó là 0một trong hai cách).

Cảm ơn Horváth Dávid đã cứu tôi một nhân vật và cảm ơn GB vì đã cứu tôi thêm 5 người nữa.


Bạn có thể sử dụng lambda ẩn danh và lưu 2 ký tự.
GB

@GB Nếu tôi không đặt tên cho hàm thì tôi phải gọi nó như thế nào? Đó là những trò gian lận với tôi. Nhưng cảm ơn vì lời khuyên khác - tôi đã xem xét điều đó nhưng đã từ chối nó bởi vì KéoScăng là 16, nhưng tôi thấy điều đó không thực sự quan trọng. :-)
Gareth


@Dennis Bạn không thể gọi nó mà không gán nó. Nó cảm thấy như lừa dối tôi, và không công bằng đối với các ngôn ngữ không có chức năng ẩn danh phải xác định tên.
Gareth

Chắc chắn bạn có thể. tio.run/nexus/ Kẻ
Dennis

10

Python , 39 36 34 33 byte

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

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

Làm thế nào nó hoạt động

Chúng ta hãy xem một vài giá trị về độ dài sáu bản sao của x và một bản sao của y modulo 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

Chúng ta có thể mã hóa các kết quả ( {-1, 0, 1} ) bằng cách ánh xạ chúng vào tập {0, 1, 2, 3} . Ví dụ, ánh xạ t 2 - t đạt được điều này và là nghịch đảo của chính nó.

Hãy biểu thị kết quả của xy theo o (x, y) . Sau đó:

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₂

May mắn thay, tất cả các bit trong các cột cuối cùng đồng ý với nhau, vì vậy chúng ta có thể HOẶC chúng để tạo thành một số nguyên n duy nhất và truy xuất o (x, y)2 - ((n ≫ o (x, y))% 4) . Giá trị của n94 .


9

Võng mạc , 35 31 byte

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

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

Giải trình

Điều này hoạt động trong hai bước. Đầu tiên, chúng tôi in các dấu trừ cho các đầu vào có liên quan. Sau đó, chúng tôi in một 0mối quan hệ và 1khác.

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

Đây là hai giai đoạn. Ở )giai đoạn thứ hai nhóm chúng lại với nhau, *làm cho chúng chạy khô (có nghĩa là chuỗi đầu vào sẽ được khôi phục sau khi chúng được xử lý, nhưng kết quả sẽ được in) và \ngăn chặn việc in một dòng cấp dữ liệu. Hai giai đoạn cùng nhau sẽ in một -nếu áp dụng.

Giai đoạn đầu tiên là một Ggiai đoạn đại diện mà chỉ giữ dòng nếu nó có chứa một trong hai k P, r Shoặc s R. Chúng tương ứng với các trường hợp chúng ta cần xuất -1. Nếu đó không phải là một trong những trường hợp đó, đầu vào sẽ được thay thế bằng một chuỗi trống.

Giai đoạn thứ hai thay thế .+(toàn bộ chuỗi, nhưng chỉ khi nó chứa ít nhất một ký tự) với -. Vì vậy, điều này in một -cho ba trường hợp và không có gì khác.

D`\w+
 .

Đây là hai giai đoạn nữa. Giai đoạn đầu tiên là một sự Dtrùng lặp. Nó phù hợp với các từ và loại bỏ trùng lặp. Vì vậy, nếu và chỉ khi đầu vào là một tie, điều này giảm từ thứ hai.

Giai đoạn thứ hai đếm số lượng trận đấu ., là khoảng trắng theo sau bởi bất kỳ nhân vật nào. Nếu đầu vào là một ràng buộc và từ thứ hai đã bị xóa, điều này dẫn đến 0. Mặt khác, từ thứ hai vẫn còn, và có một từ trùng khớp, vì vậy nó sẽ in ra 1.


Đây là một cách tiếp cận khác nhau dựa trên độ dài chuỗi đầu vào. Nó dài hơn của bạn, nhưng tôi tự hỏi liệu nó có thể được đánh golf xuống nữa không?
Chấn thương kỹ thuật số

@DigitalTrauma đó là một ý tưởng thực sự gọn gàng, nhưng tôi không thấy gì để rút ngắn nó. Tôi nghĩ dù sao bạn cũng nên đăng nó (và nếu bạn di chuyển dòng đầu tiên vào tiêu đề thì TIO sẽ không bao gồm nó trong số byte).
Martin Ender

8

05AB1E , 18 17 15 10 9 byte

6 byte được lưu với thủ thuật độ dài đầu vào của Digital Trauma

€g3^Æ>3%<

Đưa đầu vào là [SecondPlayersChoice,FirstPlayersChoice]

Hãy thử trực tuyến! hoặc Xác thực tất cả các trường hợp thử nghiệm

Giải pháp thay thế 9 byte: íø¬ÇÆ>3%<

Giải trình

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

Giải pháp 15 byte trước đó

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

Hãy thử trực tuyến! hoặc Xác thực tất cả các trường hợp thử nghiệm

Giải trình

 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

Bạn đánh bại niềm vui của tôi :( Ç¥13T/*.½òTẠI SAO CÔNG VIỆC NÓ? KHÔNG BIẾT.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn: Uuuh, đó chắc chắn là một điều kỳ lạ. Định dạng đầu vào sẽ là gì để nó trả về một int là đầu ra?
Emigna


@MagicOctopusUrn: Ồ vâng, tôi đã quên điều đó. Câu trả lời yêu thích của tôi cho thử thách này :)
Emigna

6

Thạch , 8 byte

L€Iµ-*×Ṡ

Hãy thử trực tuyến! (bộ kiểm tra, chuyển thành số nguyên cho rõ ràng)

Làm thế nào nó hoạt động

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 byte

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

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

Cảm ơn @Dennis rất nhiều vì đã cho tôi mượn mã thử nghiệm trực tuyến của anh ấy và đã tiết kiệm cho tôi 6 byte.

Biên tập

@ hashcode55 - Khá nhiều như bạn mô tả. (x! = y, -1) là chuỗi hai phần tử và [x [0] + y [0] in'RPSR '] là tính toán phần tử nào sẽ lấy. Nếu chữ cái đầu tiên của x + chữ cái đầu tiên của y nằm trong danh sách ký tự thì nó sẽ đánh giá thành True hoặc 1 vì vậy (x! = Y, -1) [1] sẽ được trả về. Nếu không thì (x! = Y, -1) [0]. Đây là nơi nó có một chút khó khăn. Yếu tố đầu tiên tự nó có hiệu quả khác nếu. Nếu x! = Y thì phần tử đầu tiên sẽ là True nếu không nó sẽ là Sai vì vậy nếu x [0] + y [0] in'RPSR 'là false thì True hoặc false sẽ được trả về tùy thuộc vào x == y. + Là một chút lén lút và một lần nữa cảm ơn @Dennis cho cái này. X! = Y sẽ trả về đúng hoặc sai theo nghĩa đen. Chúng tôi cần 1 hoặc 0. Tôi vẫn không biết làm thế nào nhưng + thực hiện chuyển đổi này. Tôi chỉ có thể giả sử rằng bằng cách sử dụng một toán tử toán học trên True / false, nó buộc nó phải được xem như là số nguyên tương đương. Rõ ràng dấu + ở phía trước -1 vẫn sẽ trả về -1.

Hi vọng điêu nay co ich!


Chào! Bạn có thể vui lòng cho tôi biết cú pháp này hoạt động như thế nào không? Theo suy đoán logic, (x!=y,-1)điều này hoạt động như nếu, nếu danh sách tạo đúng thì -1 khác x!=y. Việc sử dụng +dấu hiệu đó là gì? Một nguồn tài liệu loại cú pháp này sẽ thực sự hữu ích!
hashcode55

@ hashcode55 - Tôi đã thêm một lời giải thích cho câu trả lời của mình.
ElPedro

Để trả lời sự không chắc chắn của bạn về +- trong trường hợp này, đó là một phép cộng đơn phương, giống như +10, và về cơ bản là một cách ngắn để chuyển đổi thành một số nguyên.
FlipTack

Cảm ơn @FlipTack. Kinda đoán đó là những gì nó đang làm nhưng cảm ơn vì lời giải thích thích hợp.
ElPedro

@ElPedro Cảm ơn rất nhiều! Điều đó thực sự đã giúp tôi.
hashcode55

5

JavaScript (ES6), 46 38 byte

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

Làm cho việc sử dụng thực tế là Rock-Paper-Kéo là chu kỳ. JavaScript không có tàu vũ trụ cũng như các toán tử ternary cân bằng, nếu không câu trả lời sẽ là (a,b)=>((b<=>'Rock')-(a<=>'Rock'))%%3.

Chỉnh sửa: Đã lưu 8 byte nhờ @WashingtonGuedes.


1
@WashingtonGuedes Tôi còn có thể làm tốt hơn thế nữa!
Neil

Bạn có thể dùng cà ri để tiết kiệm 1 byte
MayorMonty

tôi đã thử chạy nó và luôn trả về 0
Vitim.us

5

MATL , 14 13 byte

TTt_0vic1Z)d)

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Nếu mã ASCII của chữ cái đầu tiên của chuỗi thứ nhất bị trừ khỏi mã của chuỗi thứ hai, chúng ta sẽ nhận được giá trị trong cột D bên dưới. Lấy modulo 5 cung cấp cho các giá trị M . Giá trị cuối cùng trong ngoặc là kết quả mong muốn, 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)

Do đó, nếu chúng ta tính D và sau đó là M , để có được R, chúng ta chỉ cần ánh xạ 0 đến 0; 1 và 2 đến 1; 3 và 4 đến −1. Điều này có thể được thực hiện bằng cách lập chỉ mục vào một mảng gồm năm mục bằng 0, 1 hoặc −1. Vì lập chỉ mục trong MATL là dựa trên 1 và mô-đun, nên mảng phải là [1, 1, −1, −1, 0](mục đầu tiên có chỉ số 1, cuối cùng có chỉ mục 5 hoặc tương đương 0). Cuối cùng, thao tác modulo 5 may mắn có thể tránh được, bởi vì nó được thực hiện hoàn toàn bằng cách lập chỉ mục mô-đun.

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 byte

0XXWW]rcrc-=

Hai đầu vào được phân tách không gian. Thứ tự của họ bị đảo ngược với điều đó trong văn bản thách thức.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Bản dịch câu trả lời MATL của tôi . Điều này khai thác thực tế là trong CJam c(convert thành char) được áp dụng trên một chuỗi có ký tự đầu tiên của nó. Ngoài ra, mảng cho ánh xạ là khác nhau vì lập chỉ mục trong CJam là dựa trên 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 byte

rW=rW=-J+3%(

Lấy mã ascii của ký tự cuối cùng của mỗi chuỗi, sau đó trả về:

(a1 - a2 + 19) % 3 - 1

Kiểm tra nó ở đây !



4

Java 7, 82 byte

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

Ung dung:

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

Giải trình:

  • Các chữ cái thứ hai là o, ac, với các số thập phân ASCII 111, 9799.
  • Nếu chúng ta trừ chúng cho các trường hợp thử nghiệm, chúng ta có kết quả như sau:
    • 0 (Đá, Đá)
    • 14 (Giấy đá)
    • 12 (Giấy, Kéo)
    • -14 (Giấy, Đá)
    • 0 (Giấy, Giấy)
    • -2 (Giấy, Kéo)
    • -2 (Kéo, Đá)
    • 2 (Kéo, giấy)
    • 0 (Kéo, Kéo)
  • Nếu chúng ta lấy modulo 5 cho mỗi, chúng tôi nhận 4, 2, -4, -2, -2, 2.
  • Chia cho 2 xbây giờ là sau cho các trường hợp thử nghiệm:
    • x = 0 (Đá, Đá)
    • x = 2 (Đá, Giấy)
    • x = 1 (Giấy, Kéo)
    • x = -2 (Giấy, Đá)
    • x = 0 (Giấy, Giấy)
    • x = -1 (Giấy, Kéo)
    • x = -1 (Kéo, Đá)
    • x = 1 (Kéo, giấy)
    • x = 0 (Kéo, Kéo)
  • Chỉ 2-2không chính xác, và nên có -11thay vào đó. Vì vậy, nếu x%2 != x(mọi thứ ở trên 1hoặc bên dưới -1), chúng tôi chia -2ra để sửa hai 'trường hợp cạnh' này.

Mã kiểm tra:

Hãy thử nó ở đây.

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

Đầu ra:

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

Tại sao lá thư thứ hai ra khỏi sự tò mò? Tôi đã có cách tiếp cận tương tự (kinda) nhưng sử dụng chữ cái đầu tiên.
Bạch tuộc ma thuật Urn

@carusocomputing Vâng, tôi nhận thấy hầu hết những người khác đang sử dụng chữ cái đầu tiên hoặc độ dài và muốn thử một cái gì đó khác. Đầu tiên tôi sử dụng các chữ cái thứ ba ( c, p, i) với các giá trị ASCII 99, 112105, vì chúng có vẻ hữu ích nhất, và nhận thấy nó sẽ trở thành 4, 2, 0 nếu tôi đã làm modulo 5. Chỉ khi đó tôi figured tôi phải trừ đi cả, vì vậy 4, 2 và 0 không được sử dụng nhiều. Sau vài lần loay hoay / thử và sai, tôi đã thử chữ cái thứ hai và nhận được kết quả hữu ích hơn với cùng một modulo 5 vẫn còn. Sau đó, tôi nhanh chóng đi đến giải pháp tôi đã trình bày ở trên. :)
Kevin Cruijssen

@carusocomputing Muốn thử một cách tiếp cận độc đáo và xem xét tôi khá tệ với các loại giải pháp này, nó không ngắn như một số giải pháp khác, nhưng vẫn là duy nhất (đó là mục tiêu ban đầu của tôi). :)
Kevin Cruijssen

4

đc, 18

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

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

Lưu ý rằng hai đối số được truyền (cách nhau bằng dấu cách) trên một dòng tới STDIN. Các đối số được chứa trong dấu ngoặc vuông [ ]vì đây là cách dcthích chuỗi của nó.

dckhả năng xử lý chuỗi rất hạn chế, nhưng hóa ra một trong những điều bạn có thể làm là sử dụng Zlệnh để có được độ dài chuỗi, điều may mắn là khác biệt đối với "Rock", "Paper" và "Kéo", và có thể khá đơn giản về mặt đối xứng Thao tác để cho kết quả mong muốn.



3

Bình thường, 16

t%+7h.+mx3ldQ3

Có lẽ có thể ngắn hơn.

        x3ld      # lambda to get string length then XOR with 3
       m    Q     # map over the input (array of 2 strings)
     .+           # difference of the two results
    h             # flatten one-element array
  +7              # add 7
 %           3    # mod 3
t                 # subtract 1 and implicit print

Trực tuyến .


3

C #, 85 84 byte

Đã lưu 1 byte, nhờ 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;

Nó chấp nhận hai chuỗi làm đầu vào và xuất ra một số nguyên. Có một sự ràng buộc, nếu hai chuỗi bằng nhau, nếu không, nó sẽ kiểm tra ký tự đầu tiên của chuỗi, để xác định xem người chơi nào thắng.


Lưu một byte bằng cách sử dụng currying tức làa=>b=>...
TheLethalCoder

3

JavaScript, 37 , 32 , 31 byte

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

Nếu a bằng b, đầu ra bằng không.

Mặt khác, xor kết quả của việc kiểm tra nếu chiều dài không lớn hơn 12 (so sánh Kéo và Giấy) với so sánh lớn hơn b.
Nếu điều này trả về 1, trả lại nó.

Nếu nó trả về 0, sử dụng toán tử OR để thay thế bằng -1.


Bạn có thể viết điều này như là một hàm được nén a=>b=>để lưu một byte không?
FlipTack

Đúng. Cảm ơn bạn @FlipTack
Grax32

2

Hàng loạt, 116 byte

@if %1==%2 echo 0&exit/b
@for %%a in (RockScissors PaperRock ScissorsPaper)do @if %%a==%1%2 echo 1&exit/b
@echo -1

2

Perl, 33 byte

32 byte mã + -pcờ.

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

Để chạy nó:

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

Đã lưu 3 byte bằng cách sử dụng biểu thức chính của câu trả lời Retina của Martin Ender . (regex trước đây của tôi là /R.*P|P.*S|S.*R/)

Giải trình:

Đầu tiên, /(.+) \1/kiểm tra xem đầu vào có chứa hai lần cùng một từ hay không, nếu vậy, kết quả là 0. Nếu không, /k P|r S|s R/giao dịch với trường hợp câu trả lời là -1. Nếu regex cuối cùng này là false, thì -/k P|r S|s R/là false, vì vậy chúng tôi quay lại 1.


2

Thạch , 9 byte

L€^3Iæ%1.

Điều này sử dụng thuật toán từ câu trả lời Bash của @ DigitalTrauma .

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

Làm thế nào nó hoạt động

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

Khỉ thật, tôi chuẩn bị bắt đầu đọc về Jelly. Oh tốt, đây là trong pyth . +1.
Chấn thương kỹ thuật số

2

Japt , 19 byte

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

Hãy thử nó ở đây!

Lấy cảm hứng từ giải pháp của carusocomputing

Giải pháp cũ 53 byte

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

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

Cảm ơn một lần nữa, ETHproductions!


1
Bạn có thể bắt đầu bằng cách sử dụng ©thay vì &&, thay đổi Ug0 cthành Ug c(cùng với V) và thay thế -1bằng J. Mặc dù vậy, nó vẫn còn khá lâu so với câu trả lời của JS , nhưng có lẽ bạn có thể lấy một số ý tưởng từ đó
ETHproductions

@ETHproductions Cảm ơn! Tôi không biết làm thế nào tôi quên về©
Oliver

1
Thật ra bạn chỉ có thể làm W=Uc. Tôi không biết tại sao tôi cứ quên nó choạt động trên bất kỳ chuỗi nào: P
Sản phẩm ETH

2

PHP, 55 53 byte

<?=(3-(ord($argv[2])%6%4-ord($argv[1])%6%4+3)%3*2)%3;
  • lấy các giá trị ascii của các chữ cái đầu tiên (từ các đối số dòng lệnh): 82,80,83
  • % 6: 4.2,5
  • % 4: 0,2,1
  • sự khác biệt (ba):
    • PS: 1-2, SR: 2-0, RP: 2-0 -> -1 hoặc 2; + 3,% 3 -> 2
    • SP: 2-1, RS: 0-2, PR: 0-2 -> -2 hoặc 1; + 3,% 3 -> 1
    • RR, PP, SS: 0; + 3,% 3: 0
  • (3-2 * x): -1,1,3
  • % 3: -1,1,0

phiên bản sin, 49 46 byte

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

một cổng golfed của câu trả lời carusocomputing's :

3 byte được lưu bởi @ user59178


1
Đối với phiên bản sin cho có thể tiết kiệm 3 byte bằng cách thay thế round(x)bằng2*x^0
user59178

2

Perl, 25 byte

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

Mã 24 byte +1 byte cho -ptùy chọn.

Đầu vào phải ở trên stdin không có dấu phân cách, ví dụ:

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

Các tìm kiếm regex đầu tiên cho người chơi đầu tiên giành chiến thắng, lần thứ hai cho sự mất mát của anh ta. Sự khác biệt được in.


1

Scala, 148 byte

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

Rất may, vì dấu chấm phẩy được yêu cầu để tách nhiều lệnh trên cùng một dòng, Scala có lợi từ việc có mã golf có thể định dạng được!

Trong nỗ lực chơi gôn này, tôi đã học được rằng bạn có thể thay thế

"somestring".charAt(index) 

với

"somestring"(index) 

bởi vì Scala cho phép bạn coi các chuỗi là mảng cho mục đích nhận các ký tự.


Điều này có thể được chơi golf vô cùng. Đối với người mới bắt đầu, bạn được phép thực hiện một chức năng thay vì một chương trình hoàn chỉnh trong hầu hết các thử thách ở đây, vì vậy thay vì toàn bộ đối tượng mở rộng điều ứng dụng và lấy từ args, hãy thử một cái gì đó như: def g (a: Seq, b: Seq) = ...
Ethan

Ngoài ra, bạn không cần in giá trị. Trả lại nó là đủ, đó là điều tuyệt vời khi chơi golf Scala, vì việc trả lại là miễn phí. Và bạn có thể cải thiện nó hơn nữa bằng cách sử dụng thủ thuật được đăng trong câu trả lời Groovy, hoạt động gần như giống hệt trong Scala.
Ethan
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.