Skor batu-kertas-gunting

70

Diberikan dua input string "Rock", "Paper", atau "Scissors", tentukan hasil putaran RPS . Keluaran 1 jika pemain pertama menang, -1 jika pemain kedua menang, atau 0 untuk seri.

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

Anda harus menggunakan string tepat "Rock", "Paper", dan "Gunting" sebagai input. Anda dapat memilih apakah pilihan pemain pertama (konsisten) diberikan pertama atau kedua. Anda dapat mengambilnya sebagai input tunggal dengan pemisah satu karakter atau kosong. Input dijamin salah satu dari 9 kemungkinan pasangan dari tiga pilihan dalam format input Anda.

Output harus berupa angka 1, 0, atau -1, atau representasi stringnya. Mengapung baik-baik saja. Begitu juga +1, +0,dan -0.

Terkait: Mengkode game RPS


Papan peringkat:

Tidak
sumber
Apakah input tunggal dengan pemisah kosong berarti misalnya "rockpaper"?
Emigna
1
@ Emigna Ya, tapi ditulis dengan huruf kapital RockPaper.
xnor
15
WAY itu lebih menyenangkan daripada yang saya perkirakan, tuan saya ada beberapa cara keren untuk melakukan ini.
Magic Octopus Mm
Bisakah input menjadi array dari dua string?
Luis Mendo
@LuisMendo Ya.
xnor

Jawaban:

73

Groovy, 67 56 50 Bytes

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

Cobalah online!

Ternyata permainan rock, kertas, gunting memiliki properti yang cukup keren.
Diberikan string a dan b, ambil huruf pertama dari masing-masing, ini menghasilkan dua berikut:R,P,S

Daftar lengkap dari nilai yang mungkin adalah (Ketika 2 pilihan digabungkan):

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

Mengatur ulang daftar ke:

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

Memberi kami urutan yang terlihat berbanding terbalik dengan sinusoidal, dan Anda benar-benar dapat mewakili rumus ini kira-kira (dan kira-kira maksud saya hanya cukup untuk bekerja, Anda bisa mendapatkan persamaan yang mati tetapi membutuhkan lebih banyak byte):

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

Penyederhanaan 4 / pi menjadi 1,3 disarankan pertama kali oleh @ flawr dan kemudian diuji oleh @titus untuk penghematan total 6 byte.

Penjelasan Persamaan

Menggunakan sifat pembulatan ganda groovy, ini menghasilkan output yang benar untuk batu-kertas-gunting.


05AB1E , 10 byte (tidak bersaing)

Ç¥13T/*.½ò

Cobalah online!

Jawaban yang sama porting ke 05AB1E menggunakan perintah baru yang ditambahkan 10/26/2017.

Guci Gurita Ajaib
sumber
3
Tidak bisa Anda membuatnya lebih pendek dengan menggunakan itu -sin(x) = sin(-x), itu berarti hanya membalik urutan adan bdan menjatuhkan terkemuka -? Selain itu, hardcoding perkiraan 4/Piseperti 1.273bisa mencukupi, atau 1.3atau 9/7atau 5/4.
flawr
2
PS: Saya juga menyarankan untuk membuat tautan untuk mencobanya secara online sehingga orang-orang seperti saya dapat bermain-main dengan kiriman Anda =)
flawr
3
Anda dapat menyimpan 1 byte dengan sin(b-a)alih - alih -sin(a-b). Great ditemukan!
Titus
2
Simpan 7 byte lainnya dengan mengalikan dengan 1.3bukannya 4/Math.PI; itu cukup tepat.
Titus
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

Panggil fdengan string yang berisi kedua pemain, tanpa pemisah, dan itu akan mengembalikan apakah yang pertama menang.

Penjelasan:

Dengan melihat sembilan string yang mungkin, ternyata pasangan surat pada kolom 7 dan 8 unik:

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

Pemain offset dan buas untuk short*mengambil pasangan surat ini, dan menafsirkannya sebagai angka:

29285
29545
21107
107
25968
21363
29555
27491
20595

Maka itu adalah masalah kekerasan untuk menemukan 51dan 4sisanya, yang diterapkan berturut-turut mengurangi angka-angka ini menjadi:

3 0 0 1 1 1 2 2 2

Yang sempurna untuk memperbaiki sisa lain di akhir, dan mengimbangi hasilnya.

Lihat langsung di Coliru

Quentin
sumber
Hanya saja, jangan melakukan apa pun seperti menghitung -f(i)untuk menghitung skor pemain lain - hasil yang tidak terduga akan dihasilkan!
nneonneo
4
@nneonneo -(f(i))seharusnya bekerja dengan baik. Makro itu menyenangkan!
nwp
18

MATLAB / Oktaf , 63 54 52 byte

Sangat nyaman bahwa kode ASCII dari huruf pertama Rock,Paper,Scissorsadalah R=82,P=80,S=83. Jika kita mengurangi 79kita dengan mudah 3,1,4, yang akan kita gunakan sekarang sebagai indeks matriks: Di sini 4x4-matrix di-hardcode, di mana i,jentri-ke-1 sesuai dengan hasil jika Anda memasukkan nilai dari sebelumnya:

     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)

Cobalah online!

cacat
sumber
16

Pure Bash, 31

Meminjam @ rumus Dennis :

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

Cobalah online .


Jawaban sebelumnya:

Pure Bash, 43 35

echo $[(7+(${#2}^3)-(${#1}^3))%3-1]
  • Dapatkan panjang string setiap arg ( 4, 5, 8masing-masing untuk Rock, Paper, Scissors)
  • XOR masing-masing dengan 3 untuk memberikan 7, 6, 11(yang ketika diambil mod 3 memberi 1, 0, 2)

  • Kemudian kurangi dan mainkan dengan mod 3 untuk mendapatkan hasil yang diinginkan.

Cobalah online .

Trauma Digital
sumber
15

Python , 40 30 byte

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

Cobalah online!

Latar Belakang

Saya sudah mulai dengan templat fungsi

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

dan menjalankan pencarian brute-force untuk parameter yang sesuai menggunakan program berikut, lalu memilih satu dengan implementasi minimal-panjang.

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

Cobalah online!

Dennis
sumber
14

Mathematica, 32 byte

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

Fungsi tanpa nama mengambil pasangan daftar karakter yang dipesan, seperti {{"R","o","c","k"},{"P","a","p","e","r"}}, dan kembali -1|0|1.

Saya ingin kode untuk menghindari tidak hanya tiga kata input, tetapi juga nama fungsi yang terlalu panjang ToCharacterCode; jadi saya bekerja dengan panjang 4,5,8kata-kata input sebagai gantinya, dan mencari fungsi pendek dari panjang yang memberikan jawaban yang berbeda modulo 3. (Divisi integer dengan 2 secara matematis menjanjikan, tetapi fungsi-fungsi tersebut memiliki nama terlalu panjang di Mathematica.)

Ternyata mengambil faktorial (panjang - 3) memberikan jawaban 1,2,120, yaitu 1,-1,0modulo 3. Kemudian kita hanya menghitung, modulo 3, perbedaan dua nilai (melalui produk titik {1,-1}.{x,y} = x-y, yang merupakan cara yang baik ketika dua nilai ada dalam daftar).

Greg Martin
sumber
1
"Ternyata ..." Kamu memiliki perhatian terhadap hal-hal ini
ngenisis
12

Ruby, 36 35 30 byte

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

Cobalah di ideone.com

Output tes:

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

Mengambil keuntungan dari kenyataan bahwa 7 dari 9 hasil yang benar dihasilkan hanya dengan melakukan perbandingan leksikografis menggunakan operator pesawat ruang angkasa <=>. The (a+b)[12]hanya membalikkan masukan untuk perbandingan jika input Paperdan Scissors(dan juga Scissors Scissors- tapi itu 0baik cara putaran).

Dengan terima kasih kepada Horváth Dávid karena telah menyelamatkan saya sebuah karakter, dan terima kasih kepada GB karena telah menyelamatkan saya 5 lagi.

Gareth
sumber
Anda dapat menggunakan lambda anonim dan menyimpan 2 karakter.
GB
@ GB Jika saya tidak memberi nama fungsi, bagaimana saya bisa menyebutnya? Itu kecurangan bagiku. Tapi terima kasih untuk tip lainnya - saya telah melihat itu tetapi menolaknya karena ScissorsScissors berusia 16, tapi saya melihat itu tidak masalah. :-)
Gareth
@ Dennis Anda tidak dapat memanggilnya tanpa menetapkannya. Rasanya seperti menipu saya, dan tidak adil pada bahasa tanpa fungsi anonim yang harus mendefinisikan nama.
Gareth
Tentu kamu bisa. tio.run/nexus/…
Dennis
10

Python , 39 36 34 33 byte

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

Cobalah online!

Bagaimana itu bekerja

Mari kita lihat beberapa nilai dari panjang enam salinan x dan satu salinan 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

Kami dapat menyandikan hasil ( {-1, 0, 1} ) dengan memetakannya ke dalam set {0, 1, 2, 3} . Sebagai contoh, pemetaan t ↦ 2 - t mencapai ini dan merupakan kebalikannya sendiri.

Mari kita menyatakan hasil dari x dan y oleh o (x, y) . Kemudian:

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₂

Untungnya, bit-bit pada kolom terakhir semua setuju dengan satu sama lain, sehingga kita bisa OR mereka untuk membentuk satu bilangan bulat n dan mengambil o (x, y) sebagai 2 - ((n »o (x, y))% 4) . Nilai n adalah 94 .

Dennis
sumber
9

Retina , 35 31 byte

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

Cobalah online!

Penjelasan

Ini bekerja dalam dua langkah. Pertama, kami mencetak tanda minus untuk input yang relevan. Kemudian kami mencetak 0untuk ikatan dan 1sebaliknya.

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

Ini dua tahap. Pada )tahap kedua mengelompokkan mereka bersama-sama, *membuat mereka menjalankan kering (yang berarti string input akan dikembalikan setelah mereka diproses, tetapi hasilnya akan dicetak) dan \menekan pencetakan dari linefeed baris tambahan. Dua tahap bersama-sama akan mencetak a -jika berlaku.

Tahap pertama adalah Gtahap rep yang hanya membuat garis jika mengandung baik k P, r Satau s R. Ini sesuai dengan kasus-kasus di mana kita perlu output -1. Jika bukan salah satu dari kasus itu, input akan diganti dengan string kosong.

Tahap kedua menggantikan .+(seluruh string, tetapi hanya jika mengandung setidaknya satu karakter) dengan -. Jadi ini mencetak -untuk tiga kasus dan tidak ada yang lain.

D`\w+
 .

Ini adalah dua tahap lagi. Tahap pertama adalah Deduplikasi. Ini cocok dengan kata-kata dan menghapus duplikat. Jadi jika dan hanya jika inputnya adalah seri, ini akan menghilangkan kata kedua.

Tahap kedua menghitung jumlah kecocokan ., yang merupakan spasi diikuti oleh karakter apa pun. Jika input adalah seri, dan kata kedua telah dihapus, ini menghasilkan 0. Kalau tidak, kata kedua masih ada di tempatnya, dan ada satu yang cocok, jadi ia mencetaknya 1.

Martin Ender
sumber
Berikut adalah pendekatan yang berbeda berdasarkan panjang string input. Ini lebih lama dari milikmu, tapi aku ingin tahu apakah itu bisa diturunkan?
Trauma Digital
@DigitalTrauma itu ide yang sangat rapi, tapi saya tidak melihat apa pun untuk mempersingkatnya. Saya pikir Anda tetap harus mempostingnya (dan jika Anda memindahkan baris pertama ke header maka TIO tidak akan memasukkannya dalam jumlah byte).
Martin Ender
8

05AB1E , 18 17 15 10 9 byte

6 byte disimpan dengan trik panjang input Trauma Digital

€g3^Æ>3%<

Mengambil input sebagai [SecondPlayersChoice,FirstPlayersChoice]

Cobalah online! atau Validasi semua kasus uji

Alternatif solusi 9 byte: íø¬ÇÆ>3%<

Penjelasan

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

Solusi 15 byte sebelumnya

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

Cobalah online! atau Validasi semua kasus uji

Penjelasan

 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
Emigna
sumber
Kau mengalahkan kegembiraanku :( Ç¥13T/*.½òMENGAPA BEKERJA? NOBODY TAHU.
Magic Octopus Mm
@ MagicOctopusUrn: Uuuh, itu aneh sekali. Apa yang akan menjadi format input untuk mengembalikan int sebagai output?
Emigna
['R','P']: P Ini port dari ini.
Magic Octopus Mm
@ MagicOctopusUrn: Oh ya, saya lupa tentang itu. Jawaban favorit saya untuk tantangan ini :)
Emigna
6

Jelly , 8 byte

L€Iµ-*×Ṡ

Cobalah online! (test suite, gips ke integer untuk kejelasan)

Bagaimana itu bekerja

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.
Dennis
sumber
6

Python 2 , 46 40 byte

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

Cobalah online!

Dengan banyak terima kasih kepada @ Dennis karena telah mengizinkan saya meminjam nya Cobalah kode tes online dan untuk menyelamatkan saya 6 byte.

Sunting

@ hashcode55 - Cukup banyak seperti yang Anda gambarkan. (x! = y, -1) adalah urutan dua elemen dan [x [0] + y [0] di'RPSR '] adalah menghitung elemen yang akan diambil. Jika huruf pertama x + huruf pertama y ada dalam daftar karakter maka akan bernilai True atau 1 sehingga (x! = Y, -1) [1] akan dikembalikan. Jika tidak maka (x! = Y, -1) [0]. Di sinilah agak sulit. Elemen pertama itu sendiri efektif jika. Jika x! = Y maka elemen pertama akan Benar jika tidak maka akan Salah jadi jika x [0] + y [0] dalam'RPSR 'salah maka Benar atau Salah akan dikembalikan tergantung pada apakah x == y. + Agak licik dan sekali lagi terima kasih kepada @Dennis untuk yang ini. X! = Y akan mengembalikan Benar Benar atau Salah. Kami memerlukan angka 1 atau 0. Saya masih tidak tahu bagaimana caranya tetapi tanda + melakukan konversi ini. Saya hanya dapat berasumsi bahwa dengan menggunakan operator matematika pada Benar / Salah itu memaksa untuk dilihat sebagai bilangan bulat yang setara. Jelas tanda + di depan -1 masih akan mengembalikan -1.

Semoga ini membantu!

ElPedro
sumber
Hai! Bisakah Anda memberi tahu saya bagaimana sintaks ini berfungsi? Secara logis menebak, (x!=y,-1)ini berfungsi seperti jika, jika daftar menghasilkan true maka -1 lain x!=y. Apa gunanya +tanda itu? Sebuah sumber yang mendokumentasikan sintaks semacam ini akan sangat membantu!
hashcode55
@ hashcode55 - Saya telah menambahkan penjelasan untuk jawaban saya.
ElPedro
Untuk menjawab ketidakpastian Anda tentang +- dalam hal ini, itu merupakan nilai tambah yang tidak disadari, seperti +10, dan pada dasarnya adalah cara singkat untuk mengonversi ke bilangan bulat.
FlipTack
Terima kasih @FlipTack. Agak menebak apa yang dilakukannya tetapi terima kasih atas penjelasan yang tepat.
ElPedro
@ ElPedro Terima kasih banyak! Itu memang membantu saya.
hashcode55
5

JavaScript (ES6), 46 38 byte

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

Memanfaatkan fakta bahwa Rock-Paper-Gunting adalah siklik. JavaScript tidak memiliki pesawat ruang angkasa atau operator ternary yang seimbang, jika tidak jawabannya adalah (a,b)=>((b<=>'Rock')-(a<=>'Rock'))%%3.

Sunting: Disimpan 8 byte berkat @WashingtonGuedes.

Neil
sumber
1
@WashingtonGuedes saya bisa melakukan lebih baik dari itu!
Neil
Anda bisa menjilat untuk menghemat 1 byte
MayorMonty
saya mencoba menjalankannya dan selalu mengembalikan 0
Vitim.us
5

MATL , 14 13 byte

TTt_0vic1Z)d)

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Jika kode ASCII dari huruf awal dari string pertama dikurangi dari yang dari string kedua kita mendapatkan nilai di kolom D di bawah ini. Mengambil modulo 5 memberikan nilai M . Nilai akhir dalam kurung adalah hasil yang diinginkan, 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)

Jadi jika kita menghitung D dan kemudian M , untuk mendapatkan R kita hanya perlu memetakan 0 ke 0; 1 dan 2 hingga 1; 3 dan 4 hingga −1. Ini dapat dilakukan dengan mengindeks ke dalam array dari lima entri sama dengan 0, 1 atau −1. Karena pengindeksan dalam MATL adalah berbasis 1 dan modular, array harus [1, 1, −1, −1, 0](entri pertama memiliki indeks 1, yang terakhir memiliki indeks 5 atau setara dengan 0). Akhirnya, operasi modulo 5 untungnya dapat dihindari, karena secara implisit dilakukan oleh pengindeksan modular.

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
Luis Mendo
sumber
5

CJam , 12 byte

0XXWW]rcrc-=

Kedua input dipisahkan oleh ruang. Urutan mereka dibalik sehubungan dengan itu dalam teks tantangan.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Terjemahan dari jawaban MATL saya . Ini mengeksploitasi fakta bahwa dalam CJam c(convert to char) yang diterapkan pada string mengambil karakter pertamanya. Juga, array untuk pemetaan berbeda karena pengindeksan di CJam berbasis 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
Luis Mendo
sumber
5

CJam, 15 14 12 byte

rW=rW=-J+3%(

Ambil kode ascii karakter terakhir dari setiap string, lalu kembalikan:

(a1 - a2 + 19) % 3 - 1

Uji di sini !

Arnaud
sumber
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;}

Tidak Disatukan:

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

Penjelasan:

  • Huruf kedua adalah o, adan c, dengan desimal ASCII 111, 97dan 99.
  • Jika kami mengurangi satu sama lain untuk kasus uji, kami memiliki hasil sebagai berikut:
    • 0 (Rock, Rock)
    • 14 (Batu, Kertas)
    • 12 (Kertas, Gunting)
    • -14 (Kertas, Batu)
    • 0 (Kertas, Kertas)
    • -2 (Kertas, Gunting)
    • -2 (Gunting, Rock)
    • 2 (Gunting, Kertas)
    • 0 (Gunting, Gunting)
  • Jika kita mengambil modulo 5 untuk masing-masing, kita mendapatkan 4, 2, -4, -2, -2, 2.
  • Dibagi dengan 2 xsekarang adalah yang berikut untuk kasus uji:
    • x = 0 (Batuan, Batuan)
    • x = 2 (Batu, Kertas)
    • x = 1 (Kertas, Gunting)
    • x = -2 (Kertas, Batu)
    • x = 0 (Kertas, Kertas)
    • x = -1 (Kertas, Gunting)
    • x = -1 (Gunting, Rock)
    • x = 1 (Gunting, Kertas)
    • x = 0 (Gunting, Gunting)
  • Hanya 2dan -2salah, dan seharusnya -1dan 1sebaliknya. Jadi jika x%2 != x(semuanya di atas 1atau di bawah -1) kita bagi dengan -2memperbaiki dua 'kasus tepi' ini.

Kode uji:

Coba di sini.

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

Keluaran:

0
-1
1
1
0
-1
-1
1
0
Kevin Cruijssen
sumber
Kenapa huruf kedua karena penasaran? Saya memiliki pendekatan yang sama (agak) tetapi menggunakan huruf pertama.
Magic Octopus Mm
@carusComputing Yah, saya perhatikan sebagian besar orang lain menggunakan huruf pertama atau panjang, dan ingin mencoba sesuatu yang lain. Saya pertama kali menggunakan huruf ketiga ( c, p, i) dengan nilai ASCII 99, 112dan 105, karena mereka tampaknya paling berguna, dan melihat itu akan menjadi 4, 2, 0 jika aku modulo 5. Hanya kemudian kupikir aku harus mengurangi keduanya, sehingga 4, 2 dan 0 tidak banyak digunakan. Setelah beberapa berkeliaran / trial-and-error saya mencoba huruf kedua dan mendapatkan hasil yang lebih bermanfaat dengan modulo 5 yang sama masih ada. Kemudian saya dengan cepat sampai pada solusi yang saya sajikan di atas. :)
Kevin Cruijssen
@carusocomputing Ingin mencoba pendekatan yang unik, dan mengingat saya sangat buruk dalam solusi semacam ini, tidak sesingkat beberapa solusi lain, tetapi masih unik (yang merupakan tujuan awal saya). :)
Kevin Cruijssen
4

dc, 18

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

Cobalah online .

Perhatikan bahwa kedua args diteruskan (dipisahkan spasi) pada satu baris ke STDIN. Args terkandung dalam tanda kurung siku [ ]karena ini adalah bagaimana dcsuka senar.

dcmemiliki penanganan string yang sangat terbatas, tetapi ternyata salah satu hal yang dapat Anda lakukan adalah menggunakan Zperintah untuk mendapatkan panjang string, yang untungnya berbeda untuk "Rock", "Paper" dan "Scissors", dan dapat dengan sederhana hanya secara aritmatika dimanipulasi untuk memberikan hasil yang diinginkan.

Trauma Digital
sumber
4

PHP, 34 byte

<?=md5("BMn$argv[1]$argv[2]")%3-1;
pengguna63956
sumber
3

Pyth, 16

t%+7h.+mx3ldQ3

Mungkin bisa lebih pendek.

        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

Online .

Trauma Digital
sumber
3

C #, 85 84 byte

Disimpan 1 byte, terima kasih kepada 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;

Ini menerima dua string sebagai input, dan output integer. Ada seri, jika kedua senar sama, jika tidak maka cek untuk karakter pertama dari string, untuk menentukan, pemain mana yang menang.

Horváth Dávid
sumber
Simpan satu byte dengan menggunakan currying yaitua=>b=>...
TheLethalCoder
3

JavaScript, 37 , 32 , 31 byte

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

Jika a sama dengan b, hasilkan nol.

Sebaliknya, untuk hasil pemeriksaan jika panjangnya tidak lebih dari 12 (perbandingan Gunting dan Kertas) dengan perbandingan lebih besar dari b.
Jika ini mengembalikan 1, kembalikan.

Jika mengembalikan 0, gunakan operator ATAU untuk mengganti dengan -1.

Grax32
sumber
Bisakah Anda menulis ini sebagai fungsi kari a=>b=>untuk menyimpan byte?
FlipTack
Iya. Terima kasih @ Liplip
Grax32
2

Batch, 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
Neil
sumber
2

Perl, 33 byte

32 byte kode + -pbendera.

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

Untuk menjalankannya:

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

Disimpan 3 byte dengan menggunakan regex jawaban Retina Martin Ender . (regex saya sebelumnya adalah /R.*P|P.*S|S.*R/)

Penjelasan:

Pertama, /(.+) \1/periksa apakah input mengandung dua kali kata yang sama, jika demikian, hasilnya adalah 0. Kalau tidak, /k P|r S|s R/berurusan dengan kasus di mana jawabannya -1. Jika regex terakhir ini salah, maka -/k P|r S|s R/itu salah, jadi kami kembali 1.

Dada
sumber
2

Jelly , 9 byte

L€^3Iæ%1.

Ini menggunakan algoritma dari jawaban Bash @ DigitalTrauma .

Cobalah online!

Bagaimana itu bekerja

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].
Dennis
sumber
Sial, aku akan mulai membaca tentang Jelly. Oh well, ini dia di pyth . +1.
Trauma Digital
2

Japt , 19 byte

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

Coba di sini!

Terinspirasi oleh solusi carusocomputing

Solusi 53-byte lama

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

Cobalah online!

Terima kasih lagi, ETHproductions!

Oliver
sumber
1
Anda bisa mulai dengan menggunakan ©alih-alih &&, mengubah Ug0 cto Ug c(sama dengan V) dan mengganti -1dengan J. Ini masih sedikit lebih lama daripada jawaban JS , mungkin Anda dapat mengambil beberapa ide dari itu
ETHproductions
@ ETHproduk Terima kasih! Saya tidak tahu bagaimana saya bisa melupakan©
Oliver
1
Sebenarnya Anda bisa melakukannya W=Uc. Saya tidak tahu mengapa saya terus lupa bahwa itu cbekerja pada string apa pun: P
ETHproduk
2

PHP, 55 53 byte

<?=(3-(ord($argv[2])%6%4-ord($argv[1])%6%4+3)%3*2)%3;
  • mengambil nilai ascii dari huruf pertama (dari argumen baris perintah): 82,80,83
  • % 6: 4,2,5
  • % 4: 0,2,1
  • perbedaan (ba):
    • PS: 1-2, SR: 2-0, RP: 2-0 -> -1 atau 2; + 3,% 3 -> 2
    • SP: 2-1, RS: 0-2, PR: 0-2 -> -2 atau 1; + 3,% 3 -> 1
    • RR, PP, SS: 0; + 3,% 3: 0
  • (3-2 * x): -1,1,3
  • % 3: -1,1,0

versi sinus, 49 46 byte

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

pelabuhan golf jawaban carusocomputing :

3 byte disimpan oleh @ user59178

Titus
sumber
1
Untuk versi sinus untuk dapat menghemat 3 byte dengan mengganti round(x)dengan2*x^0
user59178
2

Perl, 25 byte

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

Kode 24 byte +1 byte untuk -popsi.

Masukan harus pada stdin tanpa pemisah, mis:

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

Regexp pertama mencari pemain pertama yang menang, yang kedua untuk kekalahannya. Perbedaannya dicetak.

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

Untungnya, karena titik koma diperlukan untuk memisahkan beberapa perintah pada baris yang sama, Scala mendapat manfaat dari memiliki kode golf yang dapat diformat!

Dalam upaya bermain golf ini saya belajar bahwa Anda dapat menggantikannya

"somestring".charAt(index) 

dengan

"somestring"(index) 

karena Scala memungkinkan Anda memperlakukan string sebagai array untuk mendapatkan karakter.

Archmage
sumber
Ini bisa sangat golf. Sebagai permulaan, Anda diizinkan melakukan fungsi alih-alih program lengkap dalam sebagian besar tantangan di sini, jadi alih-alih seluruh objek memperluas aplikasi dan menarik dari argumen, coba sesuatu seperti: def g (a: Seq, b: Seq) = ...
Ethan
Selain itu, Anda tidak perlu mencetak nilai. Mengembalikannya sudah cukup, yang sangat bagus ketika bermain golf Scala, karena pengembaliannya gratis. Dan Anda dapat memperbaikinya lebih jauh dengan menggunakan trik yang diposting dalam jawaban Groovy, yang bekerja hampir identik di Scala.
Ethan