Batu gunting kertas

21

Menerapkan gunting kertas batu klasik.

Kondisi:

  • pengguna akan memasukkan 'r', 'p' atau 's'
  • program akan menampilkan 'r', 'p' atau 's' dan hasilnya
  • pilihan program ('r', 'p' atau 's') harus pseudo acak ( Saya melihat Anda Howard )
  • hasil dapat diwakili dengan karakter yang dapat dicetak, harus selalu ada tiga hasil yang mungkin untuk apa yang pengguna masukkan (pengguna menang, kalah atau seri).
  • apa yang terjadi jika pengguna tidak memasukkan apa pun, atau sesuatu yang berbeda yang 'r', 'p' atau 's' seharusnya tidak penting.

Kamu butuh:

  • Berikan kode golf.
  • Kode yang tidak dipisahkan
  • Bagaimana Anda menjalankan program
  • Contoh dijalankan

Saya akan memilih jawaban dengan karakter yang lebih sedikit, jika dasi menyajikan jawaban yang paling dipilih akan dipilih.

Golf yang bagus dan semoga sukses selalu menguntungkan Anda.

Saya akan memposting jawaban saya sendiri, di Jawa.

Untuk yang tinggal di gunung di bawah batu:

r = rock

p = kertas

s = gunting

rock: menang dengan gunting, kalah dengan kertas, dasi dengan batu.

kertas: menang untuk bergoyang, kalah dengan gunting, dasi dengan kertas.

gunting: menang di atas kertas, kalah dengan batu, dasi dengan gunting.

Posisi Saat Ini:

  • UN: Nama pengguna
  • PL: Bahasa Pemrograman
  • CC: Hitungan Karakter
  • UV: Up vote
╔══════════════════╦════════════╦══════╦════╗
║        UN        ║     PL     ║  CC  ║ UV ║
╠══════════════════╬════════════╬══════╬════╣
║ Howard           ║ GolfScript ║    6 ║ 15 ║
║ primo            ║ Perl       ║   27 ║  7 ║
║ TwiNight         ║ APL        ║   31 ║  4 ║
║ primo            ║ Perl       ║   33 ║  7 ║
║ marinus          ║ APL        ║   36 ║  5 ║
║ primo            ║ Perl       ║   38 ║  7 ║
║ primo            ║ Perl       ║   48 ║  7 ║
║ manatwork        ║ Ruby       ║   54 ║ 13 ║
║ w0lf             ║ GolfScript ║   62 ║  4 ║
║ tmartin          ║ K          ║   67 ║  2 ║
║ Abhijit          ║ Python 3   ║   74 ║  5 ║
║ beary605         ║ Python 3   ║   76 ║  4 ║
║ rlemon           ║ javascript ║   85 ║  4 ║
║ ugoren           ║ C          ║   86 ║  3 ║
║ Egor Skriptunoff ║ LUA        ║   87 ║  4 ║
║ Shmiddty         ║ javascript ║   87 ║  3 ║
║ Fors             ║ Befunge    ║  107 ║  3 ║
║ Briguy37         ║ javascript ║  117 ║  2 ║
║ Vi.              ║ Clojure    ║  129 ║  1 ║
║ Henrik           ║ C#         ║  167 ║  4 ║
║ dystroy          ║ Go         ║  169 ║  1 ║
║ Praveen          ║ javascript ║  250 ║  0 ║
║ ryan             ║ javascript ║  256 ║  1 ║
║ primo            ║ ferNANDo   ║  259 ║  5 ║
║ anakata          ║ Java       ║  259 ║  1 ║
║ epoch            ║ Java       ║  387 ║  1 ║
║ jdstankosky      ║ LOLCODE    ║ 1397 ║ 15 ║
╚══════════════════╩════════════╩══════╩════╝

Saya tidak dapat memilih jawaban Howards, karena ini merupakan upaya (berhasil) untuk membengkokkan aturan, tetapi saya mengubahnya, untuk membuatnya lebih eksplisit.

jawaban primo 27 karakter tidak dapat dipilih karena itu bukan pseudo random per se

primo -p jawaban, aku akan pergi dengan "-p akan dihitung sebagai 3 byte: satu untuk -, satu untuk p, dan satu lagi spasi yang diperlukan."

Terima kasih untuk semua yang menjawab, saya harap Anda bersenang-senang!

CATATAN: Saya akan mencoba mengedit ini setiap minggu, untuk menyesuaikan tabel, dan mengubah jawaban yang saya pilih jika seseorang mengalahkan yang saat ini, jadi Jika Anda baru saja sampai di sini, posting jawaban Anda jika Anda mau!

jsedano
sumber
2
Anda dapat mempertimbangkan menambahkan klausa bahwa semua hasil - Menang, Kalah, Gambar - harus dimungkinkan.
primo
Karena ini adalah popularitas, saya memutuskan untuk pergi dengan LOLZ
jdstankosky
Saya mengedit aturan sebelum Anda mengirimkan jawaban. Popularitas hanya akan menjadi pemutus dasi.
jsedano
1
Pfft, bukan lagi popularitas? Membosankan.
jdstankosky
1
@anakata Menurut aturan Perlgolf tradisional (dikompilasi oleh Ton Hospel sendiri) -pakan dihitung sebagai 3 byte: satu untuk -, satu untuk p, dan satu lagi ruang kosong yang diperlukan. Namun, banyak kompetisi lain di CG.SE telah menghitung setiap opsi sebagai satu byte. Biasanya tergantung pada penulis pertanyaan untuk memutuskan sistem mana yang akan dihormati.
Primo

Jawaban:

9

APL, 31

'TWL'[1+3|-/x⍳⎕←⍞,(?3)⌷x←'rps']

x←'rps'Tetapkan string 'rps'kex

(?3)⌷ Pilih bilangan bulat acak 1 ~ 3, pilih indeks x

⍞, Masukkan input pengguna ke pilihan mesin

⎕← Keluaran string yang dihasilkan

x⍳ Konversi ke array numerik oleh indexOf di x

-/ Perbedaan kedua angka tersebut

1+|3 Modulus 3 dan ditambah 1

'TWL'[...] pengindeksan dari 'TWL'

Mencicipi

r
rp
L

Pengguna pilih rock, pilih program kertas: Kalah

TwiNight
sumber
42

LOLCODE, 1397

Catatan: Saya mengirimkan ini sebelum saya perhatikan persyaratan menang diubah dari popularitas dengan golf tie-break ke golf dengan popularitas tie-break.

Sebenarnya tidak ada sintaks yang ketat, tapi saya yakin ini bisa diterima.

HAI
    I HAS A CRAZY, LUCKY, CHALLENGE, TREAT
    I HAS YUMMY ITZ "LOL U LOZED"
    I HAS MEH ITZ "NOWAI TIED"
    I HAS GROSS ITZ "OMG U WONNED"
    I HAS BURNT ITZ "LAME"
    GIMMEH CHALLENGE
    BTW I HOPE I R TEH WINZ
    LOL CRAZY IZ BETWEEN 1 AN 3
    I HAS A SUPA ITZ A BUKKIT
    LOL SUPA'Z 1 R "ROCK"
    LOL SUPA'Z 2 R "PAPER"
    LOL SUPA'Z 3 R "SCIZZORS"
    LOL LUCKY R SUPA'Z CRAZY
    GOT CHALLENGE, WTF?
        OMG "Rock"
            GOT LUCKY, WTF?
                OMG ROCK, LOL TREAT R MEH, GTFO
                OMG PAPER, LOL TREAT R YUMMY, GTFO
                OMG SCIZZORS, LOL TREAT R GROSS, GTFO
            OIC
        OMG "Paper"
            GOT LUCKY, WTF?
                OMG ROCK, LOL TREAT R GROSS, GTFO
                OMG PAPER, LOL TREAT R MEH, GTFO
                OMG SCIZZORS, LOL TREAT R YUMMY, GTFO
            OIC
        OMG "Scissors"
            GOT LUCKY, WTF?
                OMG ROCK, LOL TREAT R YUMMY, GTFO
                OMG PAPER, LOL TREAT R GROSS, GTFO
                OMG SCIZZORS, LOL TREAT R MEH, GTFO
            OIC
        OMGWTF
            VISIBLE "WHAT U SAYZ?", LOL TREAT R BURNT
            GTFO
    OIC
        BOTH SAEM TREAT AN BURNT, O RLY?
            YARLY
                VISIBLE "YOU BURNTED MAH TREAT!"
            NOWAI
                VISIBLE SMOOSH "I GUESSED " AN LUCKY
                VISIBLE TREAT
        KTHX
KTHXBAI

Jika ini berhasil dilaksanakan sebagai RockPaperScissors.LOL, inilah beberapa hasil acak yang mungkin:

  • Input: Rock- Output:I GUESSED SCIZZORS U WONNED
  • Input: Paper- Output:I GUESSED PAPER NOWAI TIED
  • Input: Scissors- Output:I GUESSED ROCK LOL U LOZED
  • Input: Tuna- Output:WHAT U SAYZ? YOU BURNTED MAH TREAT!
jdstankosky
sumber
6
+1 hanya karena menjadi LOLCODE. Sepertinya sesuatu yang harus saya pelajari kapan-kapan, hanya untuk LOLz.
Iszi
23

GolfScript

n"Draw"

Kode di atas mengimplementasikan fungsionalitas yang diperlukan. Selain itu, memastikan bahwa pemain tidak akan pernah marah karena (dianggap) tidak adil dari strategi komputer.

Versi tidak disatukan

n"Draw"

Cara menjalankan program

Input (karakter tunggal 'r', 'p', 's') harus disediakan di STDIN, mungkin diakhiri dengan baris baru.

Contoh dijalankan

> echo r | ruby golfscript.rb rockpaperscissors.gsc
r
Draw

Penjelasan kode

Untuk semua yang tidak terbiasa dengan GolfScript saya akan menambahkan penjelasan rinci tentang cara kode ini bekerja. Kode dasarnya ada tiga bagian.

### Computer's strategy ###
# The strategy used to play r/p/s. 
# The computer is so fast, it can really guess in an instance 
# what the player has played. Since the computer should 
# not play unfair, the best strategy is to always go for a 
# draw and choose the same move.
        # on the stack is player's move
        # choose to play the same -> now the computer's move is on the stack

### Fiddle with input ###
# The input may of may not be delimited by newline.
# In order to make the output readable, we'll give
# a newline here.
n       # Push a newline onto the stack

### Give the result ###
# We can skip a complicated calculation of the result
# since we chose to play draw anyways.
"Draw"  # Push the result onto the stack

# Output is printed automatically when GolfScript code terminates.

Catatan

Karena ini bukan golf kode tetapi kontes popularitas saya tidak memilih versi terpendek. Mungkin dalam kasus dasi, kode yang lebih pendek akan melumpuhkan solusi saya. Namun demikian, bagi mereka yang tertarik dalam bermain golf, kemungkinan berikut diberikan:

  • Hanya berurusan dengan input yang tepat dan memaksa pengguna untuk menyediakan baris baru. Ini akan menyimpan satu karakter.
  • Aturan memiliki kekurangan kecil yang memungkinkan untuk menyelamatkan karakter lain dengan menekuk aturan. Hasilnya selalu dapat dicetak sebagai "Menang" - tidak ditentukan bahwa hasil yang benar harus dicetak. Tetapi perhatikan bahwa pemain akan segera marah jika Anda memilih untuk menerapkan program curang.
  • Format output tidak ditentukan dengan baik. Kita bisa memilih 0sebagai output untuk undian. Dengan demikian, program valid terpendek adalah kode satu karakter 0.
Howard
sumber
1
OK, saya telah menambahkan lebih banyak kata dalam aturan! Saya akui saya membuat dua kesalahan rookie.
jsedano
"Satu-satunya langkah yang menang bukanlah bermain." : P
Viezevingertjes
1
+1 untuk versi yang tidak diklik dan penjelasan yang sangat bagus
izlin
Saya menyarankan n"d", ketika pertanyaan mengatakan bahwa output harus berupa karakter yang dapat dicetak, ia tidak mengatakan apa-apa tentang penggunaan kata-kata penuh.
ender_scythe
20

Ruby: 61 54 karakter

o="rps";p o[c=rand(3)],%w{Draw Win Lose}[c.-o.index$_]

Entah bagaimana menjelaskan:

Seluruh masalah dikurangi untuk menghitung hasil berikut:

  ╲ machine
h  ╲| 0 1 2
u ──┼──────
m 0 │ 0 1 2 
a 1 │ 2 0 1
n 2 │ 1 2 0

Di mana angkanya berarti:

  • Pilihan: 0 batu, 1 kertas, 2 gunting
  • hasil: 0 imbang, 1 menang, 2 kalah

Untuk ini saya menggunakan rumus: machine_choice - human_choice. Ini kadang-kadang menghasilkan nilai negatif, tetapi karena hanya digunakan sebagai indeks dan indeks negatif dihitung mundur, akan memilih elemen array yang benar.

# ┌── choosable object type
# │           ┌── machine's choice numeric code
# │           │                  ┌── result type
# │           │                  │                   ┌── human's choice
# │           │          ┌───────┴───────┐           │
  o="rps";p o[c=rand(3)],%w{Draw Win Lose}[c.-o.index$_]
#           └─────┬────┘                   └─────┬────┘  
#                 └── machine's choice letter    │
#                                                └── result numeric code

Metode yang digunakan (orang lain yang Fixnumjelas):

Tidak Disatukan:

object_type = "rps";
result_type = %w{Draw Win Lose}

machine_choice = rand(3)
human_choice = $_

p object_type[machine_choice]

result_code = machine_choice - object_type.index(human_choice)
p result_type[result_code]

Contoh dijalankan:

bash-4.2$ ruby -nle 'o="rps";p o[c=rand(3)],%w{Draw Win Lose}[c.-o.index$_]'
r
"p"
"Win"
p
"p"
"Draw"
s
"p"
"Lose"
manatwork
sumber
1
Sangat mirip dengan milikku. [(c-o.index($_)+3)%3]dapat diganti oleh [c.-o.index$_]untuk 7 byte. Juga, Anda harus menambahkan dua pada skor Anda -nlsetidaknya.
primo
1
Doh! Itu adalah niat saya yang pertama, untuk menggunakan indeks negatif. Sepertinya saya lupa untuk mencoba lagi pendekatan ini setelah memperbaiki masalah pesanan operan. Terima kasih @rimo. Dan sekali lagi terima kasih atas c.tipnya.
manatwork
Saya harus mengatakan bahwa saya menyukai jawaban ini !!
jsedano
2
@Manatwork triknya sebenarnya .-. Operator putus-putus memiliki prioritas jauh lebih rendah daripada rekan-rekan mereka yang tidak bertitik. Misalnya, a/(b+c)bisa diganti dengan a./b+c.
primo
9

C # (167 karakter)

Pertama saya mencoba bermain golf.

Golf

using System;class P{static void Main(string[] i){var m="rspr";var a=m[Environment.TickCount%3];Console.WriteLine(a+" "+(i[0][0]==a?"T":m.Contains(i[0]+a)?"W":"L"));}}

Tidak bermain golf

using System;

class P
{
    static void Main(string[] i)
    {
        var m = "rspr";
        var a = m[Environment.TickCount % 3];
        Console.WriteLine(a + " " + (i[0][0] == a ? "T" : m.Contains(i[0] + a) ? "W" : "L"));
    }
}

Contoh Jalankan Aplikasi ini membutuhkan input char tunggal sebagai argumen 1 ke aplikasi, baik r, satau p.

cmd > app.exe r

Semua hasil yang mungkin

  • cmd > app.exe rmemberikan output r T(rock, tie)
  • cmd > app.exe rmemberikan output p L(kertas, hilang)
  • cmd > app.exe rmemberikan hasil s W(gunting, menang)
  • cmd > app.exe pmemberikan output r W(rock, win)
  • cmd > app.exe pmemberikan hasil p T(kertas, dasi)
  • cmd > app.exe pmemberi hasil s L(gunting, hilang)
  • cmd > app.exe smemberikan output r L(batu, hilang)
  • cmd > app.exe smemberikan hasil p W(kertas, menang)
  • cmd > app.exe smemberikan hasil s T(gunting, dasi)
Henrik
sumber
9

Perl 48 byte

$%=rand 3;print"$%
"^B,(Draw,Lose,Win)[$%-=<>^B]

Script mencetak hasil dari perspektif komputer, misalnya jika pemain memilih rdan komputer memilih s, hasilnya adalah Lose. $%(format nomor halaman) digunakan untuk menyimpan langkah komputer, karena hanya dapat berisi nilai integer, yang menyimpan pemain int.

Tidak Disatukan:

# choose a random move index 0, 1, or 2
$cindex = int(rand 3);
# convert this index to a move
# 0 => r, 1 => s, 2 => p
$cmove = "$cindex" ^ B;

# read the player's move
$pmove = <>;
# convert this move to its index
$pindex = $pmove ^ B;

# print computer's move
print $cmove, $/;
# compare indices, and output result
@result = (Draw, Lose, Win);
print $result[$cindex - $pindex];

Penggunaan sampel:

$ echo p | perl rps.pl
s
Win

$ echo r | perl rps.pl
r
Draw

$ echo s | perl rps.pl
p
Lose

Script juga dapat dijalankan secara interaktif, dengan mengetik langkah Anda diikuti oleh Enter:

$ perl rps.pl
r
s
Lose

Peregangan Aturan

Perl 35 +3 byte

$_=($%=rand 3).(D,L,W)[$%-($_^B)]^B

Membutuhkan -psaklar baris perintah (dihitung sebagai 3 byte). Setiap hasil Win, Losedan Drawtelah dipetakan ke W, L, D. Baris baru antara pilihan komputer dan hasilnya telah dikecualikan.

Penggunaan sampel:

$ echo r | perl -p rps.pl
sL

Perl 30 +3 byte

$_=($%=rand 3).($%-($_^B))%3^B

Sekali lagi membutuhkan -p. Di sini Win, Losedan Drawtelah dipetakan ke 2, 1dan 0masing - masing. Ini masih memenuhi persyaratan teknis, karena mereka adalah karakter yang dapat dicetak.

Penggunaan sampel:

$ echo r | perl -p rps.pl
s1

Perl 24 +3 byte

$_=$^T%3 .($^T-($_^B))%3^B

Membutuhkan -p, wld dipetakan ke 2, 1, 0seperti sebelumnya. Masing ^T- masing harus diganti dengan karakter ascii literal 20. Yang ini diakui agak berlebihan; $^Tmengembalikan jumlah detik sejak zaman dari saat skrip dimulai. Semua hasil adalah mungkin, tetapi itu tidak cukup memenuhi syarat sebagai pseudo-acak.

Penggunaan sampel:

$ echo r | perl -p rps.pl
s1
primo
sumber
7

APL ( 38 36)

c[i],(⌽↑⌽∘'TWL'¨⍳3)[⍞⍳⍨c←'rps';i←?3]

Output 'T', 'W' dan 'L' untuk dasi, menang dan kalah.

Contoh dijalankan:

      c[i],(⌽↑⌽∘'TWL'¨⍳3)[⍞⍳⍨c←'rps';i←?3]
p    
rW

(Jenis pengguna 'p' untuk kertas. Komputer memilih 'r' (rock), pengguna menang)

Penjelasan:

  • ⌽↑⌽∘'TWL'¨⍳3: menghasilkan matriks berikut:
TLW
WTL
LWT
  • ⍞⍳⍨c←'rps': setel cke string 'rps', baca input pengguna dan dapatkan indeks input pengguna dalam string (ini akan menjadi nilai dari 1 hingga 3). Indeks ini digunakan sebagai koordinat Y ke dalam matriks.
  • i←?3: dapatkan nomor acak dari 1 hingga 3 dan simpan di i, ini adalah pilihan komputer. Ini digunakan sebagai koordinat X ke dalam matriks.
  • c[i]: gunakan isebagai indeks ke dalam c, menampilkan pilihan komputer sebagai 'r', 'p', atau 's'.
marinus
sumber
6

ferNANDo 1184 (259 golf ) byte

Seorang juru bahasa yang ditulis dengan Python dapat ditemukan di bagian bawah halaman yang ditautkan.

ferNANDo adalah bahasa esoterik yang hanya mendukung satu jenis variabel, boolean, dan hanya satu operasi, NAND. Seperti yang Anda bayangkan, ini bisa mengarah pada beberapa logika yang cukup panjang untuk menyelesaikan tugas yang tampaknya sederhana. Ini memiliki dukungan untuk membaca dari stdin (satu byte pada satu waktu), menulis ke stdout (juga satu byte pada suatu waktu), loop bersyarat, dan juga generator boolean acak.

Tidak ada kata kunci apa pun; semuanya adalah variabel. Fungsi pernyataan ditentukan hanya oleh jumlah variabel yang dikandungnya. Juga tidak ada komentar, jadi saya sudah melakukan yang terbaik untuk membuat kode berkomentar sendiri. Empat baris terakhir mungkin agak membingungkan, tapi mungkin akan cukup untuk mengatakan bahwa itu mencetak Win!, Loseatau Drawtergantung pada hasil.

not sure, but right now i'm guessing you're_not_paper you're_scissors
you're_paper not you're_not_paper
you're_not_scissors not you're_scissors
you're_rock you're_not_paper you're_not_scissors
you're_rock you're_rock

o_shi-
i'm_not_paper right ?
i'm_scissors right ?
i'm_paper not i'm_not_paper
i'm_not_scissors not i'm_scissors
o_shi- i'm_paper i'm_scissors
o_shi- o_shi-
o_shi-
i'm_rock i'm_not_paper i'm_not_scissors
i'm_rock i'm_rock

print right now but only if i'm_not_paper i'm_scissors
print a newline here, not more, not less

i_win_if i'm_scissors you're_paper
or_if i'm_rock you're_scissors
or_even_if i'm_paper you're_rock

i_win i_win_if or_if
i_win i_win
i_win or_even_if

i_lose_if i'm_paper you're_scissors
or_if i'm_scissors you're_rock
or_even_if i'm_rock you're_paper

i_lose i_lose_if or_if
i_lose i_lose
i_lose or_even_if

i_don't_win not i_win
i_don't_lose not i_lose
we_tie i_don't_win i_don't_lose
we_tie we_tie
we_don't_tie not we_tie

print now if i_win i_lose not i_win i_win
print but not we_tie we_don't_tie i_lose i_don't_win we_don't_tie
print right now i_lose i_win i_win we_don't_tie i_don't_win
print i_don't_win but we_tie or i_don't_win we_tie now

Script dapat dijalankan secara interaktif, dengan mengetik langkah Anda diikuti oleh Enter.

Penggunaan sampel (dengan asumsi Anda telah menamai interpreter nand.py):

$ python nand.py rps.nand
p
s
Win!

$ python nand.py rps.nand
r
r
Draw

$ python nand.py rps.nand
s
p
Lose

Sunting: Hanya untuk membuktikan bahwa ferNANDo dapat bersaing dengan Java, inilah versi 'golf' dengan kecepatan 259 byte . Logikanya sangat berbeda; ia memeriksa not windan not tie, yang menyimpan beberapa gerbang NAND (karena dengan begitu saya hanya perlu notversi gerakan pemain, dan karena not losetidak diperlukan untuk output). Namun, tidak terlalu menarik untuk dibaca.

1 _ _ _ _ _ _ A b
B 1 b
C A B
o
P 1 ?
s 1 ?
p 1 P
S 1 s
o p s
o o
o
r P S
r r
0 1 1 1 0 0 P s
0 0 0 0 1 0 1 0
t s A
u r B
v p C
W t u
W W
W v
t p A
u s B
v r C
D t u
D D
D v
w 1 W
d 1 D
l W D
l l
0 1 0 w l 1 w w
0 1 1 d D l W D
0 1 1 l w w D W
0 W 1 d 0 W d 1
primo
sumber
2
HAHAHA o_shi- o_shi- o_shi-Ini komentar diri yang lucu.
jdstankosky
1
@ jdstankosky mungkin sedikit reaksi berlebihan untuk menggulung q, tetapi ia melakukan hal yang masuk akal dan reroll.
Primo
5

Python 3.x: 74 Karakter

import time
A,f="psr",time.gmtime()[5]%3
print(A[(A.find(input())+f)%3],f)

Bagaimana itu bekerja

Before Machine Proceeds it determines the outcome of the game and based 
on the outcome, it determines the choice which would result in the outcome
viz Human's choice


\     Outcome
 \    0  1  2
  \_____________
H  | 
U 0|  0  1  2
M 1|  1  2  0
A 2|  2  0  1
N  |

Where Choices are represented as 
0 --> Paper
1 --> Scissor
2 --> Rock

Outcome (From Computer's Perspective)
0 --> Draw
1 --> Win
2 --> Fail

Given the sequence of choices as a string
"psr"
So its easy to see, if computer needs to win, it needs to choose the character
next to what human chooses. 
If computer needs to loose, it needs to choose the previous character to what
human chooses


MACHINE's|      CHOICES    |  Formulation
FATE     |-----------------|  For Machine's
         |  P     S      R |  Choice
---------|-----------------|-----------------------------
WIN(1)   |        H ---> M | (CHOICE+1) % 3 = (CHOICE+WIN)%3 
---------|-----------------|-----------------------------
LOSS(2)  |  M     H -----\ | (CHOICE+2)%3   = (CHOICE+LOSS)%3 
         |  ^            | |
         |  |____________| |
---------|-----------------|------------------------------       
DRAW(0)  |        H        | (CHOICE+0)%3   = (CHOICE+DRAW)%3
         |        M        |  
---------|-----------------|         

Combining all the above we have

MACHINE's CHOICE = (HUMAN CHOICE + MACHINE's FATE) % 3

Berdasarkan nasib, itu menentukan apa yang harus pilihannya didasarkan pada formula

result = (User_choice + machines_fate) % no_of_choices

machine_choice = "psr"[result]

Versi Un-golfed

import time
choices = "psr"
#time.gmtime() returns the time structure in gmt
#time.gmtime()[5] is the current second tick
fate = time.gmtime()[5]%3
user_choice = input()
result = (choices.find(user_choice)+fate)%len(choices)
machine_choice = choices[result]
print(machine_choice, fate)

Contoh dijalankan

D:\temp\rivalry>rps.py
r
r 0

D:\temp\rivalry>rps.py
r
p 1

D:\temp\rivalry>rps.py
p
r 2

D:\temp\rivalry>rps.py
p
r 2

D:\temp\rivalry>rps.py
p
s 1

D:\temp\rivalry>rps.py
p
s 1

D:\temp\rivalry>rps.py
p
p 0
Abhijit
sumber
2
menarik, memutuskan terlebih dahulu hasilnya, lalu melemparkan tanda apa pun untuk mendapatkan hasil itu ...
acolyte
1
Saya tidak yakin waktu dalam detik memenuhi syarat dalam "pilihan program ('r', 'p' atau 's') harus pseudo acak" . Milidetik mungkin akan melakukannya.
Primo
4

Lua, 87

c,n=os.time()%3+1,'rps'print(n:sub(c,c),({'Draw','Win','Defeat'})[(n:find(...)-c)%3+1])

Pemakaian:

$ lua rps.lua p
s   Defeat

Tidak Disatukan:

names = 'rps'
comp_idx = os.time()%3 + 1                -- 1, 2 or 3 (depends on timer)
comp_move = names:sub(comp_idx, comp_idx) -- 'r', 'p' or 's'
user_move = ...                           -- input parameter: 'r', 'p' or 's'
user_idx = names:find(user_move)          -- 1, 2 or 3
delta_idx = (user_idx - comp_idx) % 3     -- 0, 1 or 2
all_results = {'Draw', 'Win', 'Defeat'}   -- [1]=='Draw', [2]=='Win', [3]=='Defeat'
game_result = all_results[delta_idx + 1]
print(comp_move, game_result)
Egor Skriptunoff
sumber
Anda dapat menyimpan 3 karakter dengan menggunakan 'Kalah' alih-alih 'Kalahkan' dan 'Ikat' alih-alih 'Draw'. ;)
Roddy of the Frozen Peas
4

GolfScript 62

Solusi GolfScript alternatif, jauh lebih membosankan daripada Howard :).

Program memilih langkah secara acak dan menampilkan hasil dari perspektif pengguna.

Kode

'rssppr'.[6rand=]''+:§@+..&,({?)§\'Lose''Win'if}{;;§'Draw'}if`

Contoh dijalankan

> gema s | ruby golfscript.rb rps.gs

r "Kalah"

Tes online

Anda dapat menjalankan program dan bereksperimen dengan input yang berbeda di sini: http://golfscript.apphb.com/?c=OydzJwoKJ3Jzc3BwcicuWzZyYW5kPV0nJys6wqdAKy4uJiwoez8pwqdcJ0xvc2UnJ1dpbid3dpdjpdmn

Namun, perhatikan bahwa parameter (pemindahan pengguna) yang biasanya dilewatkan dalam baris perintah sekarang ditambahkan ke tumpukan dalam kode itu sendiri (tidak ada cara untuk memberikan parameter baris perintah "nyata" dalam alat online ini).

Versi "Tidak Terikat"

Saya tidak tahu apa artinya ungolfed ketika datang ke GolfScript, jadi saya mencoba untuk menambahkan komentar. Semoga itu akan menjelaskan cara kerja kode dan membuatnya sedikit lebih mudah dibaca:

# initially, the input (user's move) is on the stack

'rssppr'                # push the string 'rsspr' on the stack...
.                       # ...twice.

[
    6rand               # get a pseudo-random integer in the [0-5] range
    =                   # use the random index to get 
                        # a letter from the string above

]''+                    # workaroud to get the actual letter instead of the
                        # ASCII code

:§                      # assign the randomly chosen letter (computer's move)
                        # to a nice variable called "§"

@                       # rotates last 3 elements on the stack, bringing
                        # the user input in the uppermost position
                        # So, now we have: "rssppr" <computer_move> <user_move>
                        # on the stack

+                       # concatenate the two moves, so now we have a string
                        # that contains both (ex: "rs")

..                      # copy the move string twice
&                       # do a setwise AND to get the DISTINCT elements
,(                      # get the length of the resulting string and subtract 1
                        # (now we have 0 if the letters were equal and non-zero otherwise)

{                       # beginning of block to execute when the moves are different:

                        # now we have on the stack two strings:
                        #     - the string 'rssppr'
                        #     - the string containing the moves (ex: 'rs')

    ?                   # find the second string inside the first one,
                        # and get the index at which it occurs
                        # (or -1 if it does not)

    )                   # increment that number (we now get 0 if no occurrence, 1 otherwise)

    §                   # recall the § variable (so we display the computermove)
    \                   # rotate the uppermost two stack entries

    'Lose''Win'if       # if the move pair is found in the 'rssppr' string, 
                        # then print 'Lose', otherwise print 'Win'
}

{                       # beginning of block to execute when the moves are identical:

    ;;                  # discard the latest two stack items (not needed in this case)
    §                   # display computer's move
    'Draw'              # display the text 'Draw'
}
if                      # if computer's and user's moves were NOT equal, 
                        # execute the first block.
                        # if they were, execute the second block

`                       # put the last word in quotes to separate it from computer's move
Cristian Lupascu
sumber
4

C, 92 86 karakter

main(y){
    srand(time(0));
    y="rps"[rand()%3];
    printf("%c%c\n",y,"LWWTLLW"[getchar()-y+3]);
}

Mencetak pilihan komputer, dan hasil dari sudut pandang pengguna - W = Anda menang, L = Anda kalah, T = dasi.
Rumus sederhana x-y, diberikan nilai ASCII dari pilihan, memberikan 0 pada gambar (jelas) dan nilai unik dalam setiap kasus lainnya.

ugoren
sumber
4

Python 2 ( 86 84 80 78), Python 3 - 76 karakter

0 - seri, 1 - kalah, 2 - menang

from random import*
a=raw_input()
b=choice('psr')
print(a!=b)+(b+a in'rpsr'),b

from random import*
a=input()
b=choice('psr')
print((a!=b)+(b+a in'rpsr'),b)

Tidak disatukan

from random import*
moves = 'psr'
inp   = raw_input()
comp  = choice(moves)
match = comp+inp
is_not_tie = inp!=comp
wins = 'r' + moves         #rpsr; rock beats scissors, scissors beats paper, paper beats rock
print is_not_tie + (match in wins), comp

Cara menjalankan: python file_name_here.py

Masalah:
AI Komputer: 35 karakter

beary605
sumber
1
Bagus! Saya pikir Anda tidak perlu A, dan Anda dapat menyimpan char lain dengan from random import*.
grc
@ grc: terima kasih, saya tidak mencoba from random, karena saya pikir itu tidak mengubahnya ...
beary605
Anda dapat menghapus 2 karakter lebih lanjut dengan mengubah (a == b) * 2 menjadi (a! = B) dan mengubah hasil menjadi "0-dasi, 1-menang, 2-kalah"
Dhara
Maaf, berarti "" 0-dasi, 1-kalah, 2-menang "
Dhara
@Dhara: Terima kasih, tidak akan menemukan jawabannya. manatwork: Oh! Saya akan memperbaikinya.
beary605
4

Pertama coba tanpa meninjau orang lain.

golf: 107 85 byte

i=prompt(),c="rps"[new Date%3],w={r:"s",p:"r",s:"p"};alert(c+(i==w[c]?2:w[i]==c?1:3))

output adalah [npc-choice] [1: win, 2: loss, 3: tie]

ungolfed:

var input = prompt(),
    choices = ["r","p","s"],
    computer_choice = choices[Math.floor(Math.random() * 3)],
    outcomes = {'r':'s','p':'r','s':'p'},
    winner;

    if( input == outcomes[computer_choice] ) {
        winner = 'NPC';
    } else if ( computer_choice == outcomes[input] ) {
        winner = 'You';
    } else {
        winner = 'No one, it was a Tie!';
    }

    alert('Computer chose: ' + computer_choice + '\n' +
          'The winner is: ' + winner);
rlemon
sumber
4

PowerShell: 144 133 117 111 111 92 73

Perubahan dari aslinya:

  • Benar-benar menulis ulang skrip setelah melihat solusi tiga pemain Danko Durbic yang genap atau ganjil .
  • Mengubah $ s menjadi string tunggal alih-alih array karakter.
  • Digunakan IndexOf sebagai metode langsung pada $ s, alih-alih mengeja kelas .NET & metode.
  • Dihapus berlebihan %3.

Semua mengatakan, hampir memotong setengah dari jawaban asli saya!

Kode golf:

$p=($s='rps').IndexOf((read-host));$s[($c=Random 3)];"TWLLTWWLT"[$p+$c*3]

Dapat dijalankan langsung dari konsol.

Tidak disatukan, dengan komentar:

# Variable $p will store the player's selection as a ternary digit by finding its position in a string containing the possible choices.
$p=(
    # Possible choices will be stored in a variable, $s, for later reuse.
    $s='rps'
# Get the position of the player's choice from $s.
).IndexOf((read-host));

# Express the computer's choice by outputting the appropriate character from $s.
$s[(
    # Computer's choice will be stored as a ternary digit in $c.
    $c=Random 3
)];

# Outcome for the player will be chosen from a string of possible outcomes by looking up the decimal repesentation of a two-digit ternary number.
# The threes digit is represented by $c, ones digit by $p.
"TWLLTWWLT"[$p+$c*3]

# Variable cleanup - do not include in golfed code.
rv p,s,c

Beberapa sampel berjalan di konsol:

masukkan deskripsi gambar di sini

Iszi
sumber
3

JAVA 259 :(

class c {public static void main(String[]a){char y=a[0].charAt(0);char m="rps".charAt(new java.util.Random().nextInt(3));if(y==m)a[0]="T";else if((y=='r'&& m=='s')||(y=='s'&& m=='p')||(y=='p'&& m=='r'))a[0]="1";else a[0]="0";System.out.println(m+":"+a[0]);}}

Kode yang sangat tidak diseragamkan:

class c {
    public static void main(String[] a) {
        char y = a[0].charAt(0);
        char m = "rps".charAt(new java.util.Random().nextInt(3));
        if (y == m) {
            a[0] = "T";
        } else if ((y == 'r' && m == 's') || (y == 's' && m == 'p') || (y == 'p' && m == 'r')) {
            a[0] = "1";
        } else {
            a[0] = "0";
        }
        System.out.println(m + ":" + a[0]);
    }
}

Sampel berjalan:

C:> java cr

s: 1

C:> java cp

p: T

C:> java cs

s: T

jsedano
sumber
3

Befunge: 107 karakter

~v@,"w"<   <   <  <
v?v3.14159265@,"l"<
"""358979323846>3-|
rps26433832>:1+|
"""7950>:2+|
>>>:,-:|
28@,"t"<

Agak kikuk. Itu menyusut, pertanyaannya adalah berapa banyak.

Untuk S
sumber
3

JavaScript (87)

Golf:

o='LDW'[2*((a=prompt())+(b='prs'[new Date%3])!='ps'&a<b|a+b=='sp')+ +(a==b)];alert(b+o)

Tidak Disatukan:

var player = prompt(), 
    computer = 'prs'[new Date%3], // Date mod 3 "pseudo-random"
    outcome = 'LDW'[2*(player+computer != 'ps' 
                    & player < computer 
                    | player + computer == 'sp') // convert boolean W/L outcome to int (0,2)
              +
              +(player == computer)]; // convert D outcome to int (0,1)
alert(computer + outcome);

Anda cukup menempelkan kode di konsol javascript browser Anda untuk menjalankannya.

Jika saya diizinkan mencetak hasilnya sebelum mencetak pilihan komputer (83) :

alert('LDW'[2*((a=prompt())+(b='prs'[new Date%3])!='ps'&a<b|a+b=='sp')+ +(a==b)]+b)
Shmiddty
sumber
2

K, 67

{-1'f:x,*1?"rps";$[f in b:("pr";"rs";"sp");"W";f in|:'b;"L";"D"]}

Mencetak W, L, D untuk menang / kalah / seri.

Tidak Disatukan:

rps:{[x]
    res:x,*1?"rps";        // join user input to random selection of r,p,s
    -1'f;                  // print the user input and the program selection to stdout
    wins:("pr";"rs";"sp"); // the universe of winning combinations
    losses:|:'wins;        // reverse each win to the get losses

    $[f in wins;    
        "win";
    f in losses;
        "lose";
    "draw"]
    }

Atau dalam Q, yang lebih mudah dibaca:

rps:{[x]
    res:x,rand["rps"];        // join user input to random selection of r,p,s
    -1 each f;                // print the user input and the program selection to stdout
    wins:("pr";"rs";"sp");    // the universe of winning combinations
    losses:reverse each wins; // reverse each win to the get losses

    $[f in wins;    
        "win";
    f in losses;
        "lose";
    "draw"]
    }

Contoh Run:

k){-1'f:x,*1?"rps";$[f in b:("pr";"rs";"sp");"W";f in|:'b;"L";"D"]}"r"
r
s
"W"
k){-1'f:x,*1?"rps";$[f in b:("pr";"rs";"sp");"W";f in|:'b;"L";"D"]}"s"
s
s
"D"
k){-1'f:x,*1?"rps";$[f in b:("pr";"rs";"sp");"W";f in|:'b;"L";"D"]}"p"
p
s
"L"
tmartin
sumber
2

Javascript, 117 karakter

Berikut adalah pendekatan berbasis data untuk masalah ini. Ini mungkin dapat dioptimalkan dengan menghasilkan data win / loss / draw alih-alih memetakannya secara manual, tapi ini awal :)

Golf:

alert((r=[{v:"r",r:d="D",p:w="W",s:l="L"},{v:"p",r:l,p:d,s:w},{v:"s",r:w,p:l,s:d}][Math.random()*3|0]).v+r[prompt()])

Tidak Disatukan:

//Output the result to the user
alert(
    (
        //Store the random computer outcome data
        randomRPSData =
            //Create the data for if the computer chooses r, p, or s
            [
                {
                    value: "r",
                    r: (d = "Draw"),
                    p: (w = "Win"),
                    s: (l = "Lose")},
                {
                    value: "p",
                    r: l,
                    p: d,
                    s: w},
                {
                    value: "s",
                    r: w,
                    p: l,
                    s: d}
            ]
            //Have the computer pick a random variable
            [Math.random() * 3 | 0]

    //Output the value the computer chose
    ).value

    //Output whether the user won or not
    + r[prompt()]
);

Akhirnya, inilah biola dengan keduanya.

Briguy37
sumber
1

Javascript: 256

golf:

i=prompt(),a=['p','r','s'];a=a[Math.floor(Math.random()*(3-1+1))+1];if(i==a){alert('d');}else if(i=='p'){if(a=='s'){alert('l');}else{alert('w');}}else if(i=='r'){if(a=='s'){alert('w');}else{alert('l');}}else if(i=='s'){if(a=='r'){alert('l');}else{alert('w')}}

ungolfed:

i=prompt(),a=['p','r','s'];
a=a[Math.floor(Math.random()*(3-1+1))+1];
if(i==a){
    alert('d');
}
else if(i=='p'){
    if(a=='s'){
        alert('l');
    }else{alert('w');}
}else if(i=='r'){
    if(a=='s'){
        alert('w');
    }else{alert('l');}
}else if(i=='s'){
    if(a=='r'){
        alert('l');
    }else{alert('w')}
} 
Ryan
sumber
1

Clojure:

(def r 0) (def s 1) (def p 2)
(def object-name #(get {'p "Paper", 's "Scissors", 'r "Rock"} %))
(def result-name #(get {\d "Draw", \w "Win", \l "Lose"} %))
(defn computer-choice [] (nth ['r 's 'p] (int (rand 3))))
(defn game [a b] (get "dwlldwwld" (+ (* 3 a) b) ))
(defn print-game [user comp result] (print (format
  "User: %s\nComputer: %s\nResult: %s\n" 
  (object-name user) (object-name comp) (result-name result))))
(println "Enter 'p', 's' or 'r' and press return")
(let [comp (computer-choice),  user (read)]  (print-game user comp (game (eval user) (eval comp))))

Versi mini (129 karakter kode):

java -jar clojure.jar -e \
"(def r 0)(def s 1)(def p 2)(let[u(read),c(nth['r 's 'p](int(rand 3)))](print c)(print (get \"dwlldwwld\"(+(* 3(eval u))(eval c)))))"
Vi.
sumber
1

JAVA (387) kode golf pertama!

import java.util.HashMap;public class _ {public static void main(String i[]){HashMap l = new HashMap(){{put('r',0);put('p',1);put('s',2);put(0,'T');put(1,'L');put(2,'W');}};char u =i[0].charAt(0);char c ="rps".charAt((int)(Math.random()*3)%3);int[][] m =new int[][]{{0,1,2},{2,0,1},{1,2,0}};System.out.println("U"+u+"C"+c+"R"+(Character)l.get(m[(Integer)l.get(u)][(Integer)l.get(c)]));}}

Tidak disatukan

import java.util.HashMap;
public class _ {
    public static void main(String[] input) {
       input = new String[] {"s"};
       HashMap lookup = new HashMap(){{
           put('r', 0);
           put('p', 1);
           put('s', 2);
           put(0, 'T');
           put(1, 'L');
           put(2, 'W');
       }};
       char user = input[0].charAt(0);
       char computer = new char[] {'r', 'p', 's'}[(int)(Math.random()*3)%3];
       int[][] matrix = new int[][] {{0,1,2}, {2,0,1}, {1,2,0}};

       Integer userChoice = (Integer) lookup.get(user);
       Integer computerChoice = (Integer) lookup.get(computer);
       Character result = (Character) lookup.get(matrix[userChoice][computerChoice]);

       System.out.println("u:" + user + ",c:" + computer + ",r:" + result);
    }
    /*
     t = 0, l = 1, w = 2
     *
        +---------------+
        | * | r | p | s |
        +---------------+
        | r | 0 | 1 | 2 |
        +---------------+
        | p | 2 | 0 | 1 |
        +---------------+
        | s | 1 | 2 | 0 |
        +---------------+
     */
}

Golf (Jarak / Lekukan)

import java.util.HashMap;
public class _ {
public static void main(String i[]) {
    HashMap l = new HashMap(){{
        put('r',0);put('p',1);put('s',2);put(0,'T');put(1,'L');put(2,'W');
    }};

    char u =i[0].charAt(0);char c = "rps".charAt((int)(Math.random()*3)%3);
    int[][] m =new int[][]{{0,1,2},{2,0,1},{1,2,0}};

    System.out.println("U"+u+"C"+c+"R:"+(Character)l.get(m[(Integer)l.get(u)][(Integer)l.get(c)]));
}}

Bukan kode terpendek, tetapi percobaan pertama saya

masa
sumber
1
Beberapa peningkatan yang mungkin Anda terapkan: 1) import java.util.*2) HashMap l-> Map l3) dilemparkan ke (int)alih-alih (Integer)4) new Random().nextInt(3)5) hapus new int[][]6) hapus gips ke (Character)7) gunakan ints alih-alih karakter.
Howard
1

Go (169)

Golf:

package main
import("fmt";"os")
func main(){v:=map[uint8]int{114:0,112:1,115:2}
u:=os.Args[1][0]
c:="rps"[os.Getpid()%3]
fmt.Printf("%c\n%c\n",c,"TWL"[(3+v[c]-v[u])%3])}

Tidak disatukan (seperti yang diformat oleh go fmt):

package main

import (
    "fmt"
    "os"
)

func main() {
    v := map[uint8]int{114: 0, 112: 1, 115: 2}
    u := os.Args[1][0]
    c := "rps"[os.Getpid()%3]
    fmt.Printf("%c\n%c\n", c, "TWL"[(3+v[c]-v[u])%3])
}

Jalankan:

jalankan main.go hal

s

W

Denys Séguret
sumber
1

Pyth , 23

J"rps"K+wOJK%-XJ'KXJtK3

Output dalam bentuk:

Tie: 0 Menang: 1 Kehilangan: 2

Penjelasan:

J"rps"             J="rps"
K+wOJ              K=input()+random_choice(J)
K                  print K
  XJ'K             index of K[0] in J
      XJtK         index of K[1] in J
 -XJ'KXJtK         difference of above indexes
%-XJ'KXJtK3        above difference mod 3

Jalankan sebagai berikut:

$ cat rps
J"rps"K+wOJK%-XJ'KXJtK3
s
$ cat rps | python3 pyth.py
< Extraneous debug output removed>
sp
1

Untuk hanya 4 karakter lagi, kita dapat menggunakan T untuk dasi, W untuk menang dan L untuk kehilangan:

J"rps"K+wOJKr@"TWL"-XJ'KXJtK

Semuanya sama sampai perbedaan indeks, pada titik mana kita menggunakan perbedaan sebagai indeks ke dalam string "TWL".


Catatan: sementara saya mengembangkan bahasa ini setelah tantangan diposting, saya belum melihat tantangan sampai hari ini. Tantangan itu tidak mempengaruhi aspek bahasa apa pun.

isaacg
sumber
0

Groovy, 89

v='rps'
r=new Random().nextInt(3)
print"${v[r]}${'TLW'[((r-v.indexOf(this.args[0]))%3)]}"

Mengambil pilihan pengguna sebagai argumen. Contoh:

groovy rps.groovy p
sL
Roger Lindsjö
sumber
0

C # & LinqPad 133

golf:

char i,c,r;i=Console.ReadLine()[0];var a="prsp";c="prs"[new Random().Next(3)];r=i==c?'T':a.Contains(""+i+c)?'W':'L';(c+">"+r).Dump();

ungolfed:

        char i, c, r; // i for input / c for choosen by computer / r for result
        i = Console.ReadLine()[0]; //getting input in LinqPad
        var a = "prsp"; 
        c = "prs"[new Random().Next(3)]; // Computer choose a random string
        r = i == c ? 'T' : a.Contains("" + i + c) ? 'W' : 'L'; (c + ">" + r).Dump(); //check for win - dump for output in LinqPad

contoh output (input s): r> L // Komputer memilih rock (r) -> jadi kami kehilangan

EvilFonti
sumber
0

JavaScript (79)

Membenturkan yang lama, tapi ini dia ...

Dengan bonus tambahan bahwa Anda dapat menggunakan batu apa saja yang Anda suka pegnatite, pyroxenite, scoria, sovite, kimberlite, trondjemite, tuf atau lainnya. Satu-satunya batasan adalah Anda tidak dapat menggunakan patau s ;-)


Memasukkan:

r = rock      (Or , ...)
p = paper
s = scissors

Keluaran:

[computers choice][0=Loss, 1=Win, 2=Draw]

Contoh:

User  Computer  Result
r     r         r2
r     p         p0
r     s         s1

Kode golf:

u=~~{p:1,s:2}[prompt()],c=new Date%3;alert('rps'[c]+(u==c?2:!u&c>1|u&!c|u>1&c))

Trik utama yang digunakan adalah:

1. u = ~~{}[prompt()]

       Menggunakan objek {}dan mengambil nilai dengan input pengguna dari prompt(). Sejauh ini baik. Maka alih-alih memiliki r : 0kita dapat memaksanya untuk dikonversi 0dengan menggunakan ~~operator NOT. Hal ini sering digunakan untuk nomor lantai, tetapi juga memiliki (keuntungan) tidak kembali NaNketika operator lain akan, seperti misalnya: +{a:1, b:2}['c'].

2. c = new Date%3

       Tanggal sering diakali dengan misalnya menggunakan +new Dateuntuk mengubahnya menjadi timestamp secara langsung, kalau tidak orang akan mendapatkan representasi string. Di sini dengan menggunakan mod satu mencapai efek yang sama.

3. 'rps'[c]

       Akses terindeks pada string yang memberikan pilihan komputer 0 = r, 1 = patau 2 = s.

4. (u==c ? 2 : !u&c>1 | u&!c | u>1&c )

   IF  u == c
       Draw                    (aka 2)
   ELSE IF !u&c>1|u&!c|u>1&c 
       Win                     (aka 1)
   ELSE
       Loss                    (aka 0)
   ENDIF


...

Kode ungolfed bisa berupa ini:

function rock_paper_scissors() {
    var choices = {
            r : 0,
            p : 1,
            s : 2,
        },
        tr_table = ['Rock','Paper','Scissors'],
        user, pc, result
    ;

    function get_input() {
        var input = prompt("Enter your choice `r', `p' or `s':")
                    .toLowerCase();

        if (!/^[rps]/.test(input)) {
            console.warn("Bad input. Please choose `r', `p' or `s'.");
            // return get_input();
            return null;
        }
        return input[0];
    }
    function report(c1, c2) {
        if (c1 === pc) {
            return 'Draw';
        } else if (
            (c1 === 0 && c2  >  1) ||
            (c2 === 0 && c1 === 1) ||
            (c1  >  1 && c2  >  0)
        ) {
            return 'Win';
        } else {
            return 'Loss';
        }
    }

    if ((user = get_input())) {
        user = choices[user];
        pc = Math.floor(Math.random() * 3);
        result  = 
            'Computers choice: ' + tr_table[pc] + ', ' +
            'Your choice: ' + tr_table[user] + ', ' +
            'Result=' +  report(user, pc);
        console.log(result);
    }
    return result;
}

rock_paper_scissors();
Runium
sumber
0

Golfscript - 29

Ini adalah jawaban aktual saat ini (melihat Anda n"Draw",: P).

'rps'.@\?3rand.@- 3%@@[=]''+\

Tidak Disatukan:

'rps'3rand[=]''+.2$={\;'
T'}{.@'rspr'.@?@@(;\?='
L''
W'if=}if

Anda dapat menjalankannya dengan ruby golfscript.rb MyCode.txt, di manaMyCode.txt kode program.

Contoh berjalan (semua dengan input "r", tetapi bekerja dengan segalanya) (dasi adalah 0, menang adalah 2, kerugian adalah 1):

ruby golfscript.rb MyCode.txt
r0
ruby golfscript.rb MyCode.txt
p2
ruby golfscript.rb MyCode.txt
s1

Jika Anda ingin penjelasan tentang versi dan / atau melihat peningkatan potensial, katakan padaku.

Josiah Winslow
sumber
0

Javascript, 65 71 70

Tanpa output pilihan komputer: 65

alert('-+0+0+0'['rppssrr'.indexOf('rps'[new Date%3]+prompt())+1])

Hanya untuk menguji solusi itu sudah benar:

for(x in {r:0,p:0,s:0})
  for(y in {r:0,p:0,s:0})
    console.log("%s %s %s", x, y, '-+0+0+0'['rppssrr'.indexOf(x+y)+1])

Dengan output pilihan komputer: 71

alert((c='rps'[new Date%3])+'-+0+0+0'['rppssrr'.indexOf(c+prompt())+1])

70

alert((g='rps'[new Date%3]+prompt())+-('srps'.match(g)?-1:g[0]!=g[1]))

dan tesnya:

for(x in {r:0,p:0,s:0})
  for(y in {r:0,p:0,s:0})
    console.log((g=x+y)+-('srps'.match(g)?-1:g[0]!=g[1]))
Qwertiy
sumber