Kéo giấy Rock


21

Thực hiện kéo giấy đá cổ điển.

Điều kiện:

  • người dùng sẽ nhập 'r', 'p' hoặc 's'
  • chương trình sẽ xuất ra 'r', 'p' hoặc 's' và kết quả
  • lựa chọn chương trình ('r', 'p' hoặc 's') phải là giả ngẫu nhiên ( tôi đang nhìn bạn Howard )
  • kết quả có thể được biểu thị bằng bất kỳ ký tự có thể in nào, phải luôn có ba kết quả có thể có cho những gì người dùng đã nhập (người dùng thắng, thua hoặc hòa).
  • Điều gì xảy ra nếu người dùng không nhập gì, hoặc thứ gì đó khác biệt 'r', 'p' hoặc 's' không quan trọng.

Bạn cần phải:

  • Cung cấp mã đánh gôn.
  • Mã không mã hóa
  • Làm thế nào để bạn gọi chương trình
  • Chạy mẫu

Tôi sẽ chọn câu trả lời có ít ký tự hơn, nếu cà vạt thể hiện câu trả lời được bình chọn nhiều nhất sẽ được chọn.

Chơi golf tốt và có thể may mắn được bao giờ có lợi cho bạn.

Tôi sẽ đăng một câu trả lời cho chính tôi, trong Java.

Đối với những người sống trong một ngọn núi dưới một tảng đá:

r = đá

p = giấy

s = kéo

đá: thắng để kéo, thua bằng giấy, hòa với đá.

giấy: thắng đá, thua bằng kéo, cà vạt bằng giấy.

kéo: thắng với giấy, thua với đá, cà vạt bằng kéo.

Vị trí hiện tại:

  • LHQ: Tên người dùng
  • PL: Ngôn ngữ lập trình
  • CC: Số lượng nhân vật
  • UV: Lên phiếu
╔══════════════════╦════════════╦══════╦════╗
║        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 ║
╚══════════════════╩════════════╩══════╩════╝

Tôi không thể chọn câu trả lời của Howards, vì đó là một nỗ lực (thành công) để bẻ cong các quy tắc, nhưng tôi thay đổi chúng, để làm cho chúng rõ ràng hơn.

Câu trả lời 27 ký tự không thể được chọn vì nó không giả ngẫu nhiên mỗi se

primo -p trả lời, tôi sẽ đi với "-p sẽ được tính là 3 byte: một cho -, một cho p và thêm một khoảng trắng cần thiết."

Cảm ơn tất cả những người đã trả lời, tôi hy vọng bạn đã có một thời gian tốt!

LƯU Ý: Tôi sẽ cố gắng chỉnh sửa điều này mỗi tuần, để điều chỉnh bảng và thay đổi câu trả lời đã chọn của tôi nếu ai đó đánh bại câu hỏi hiện tại, vì vậy nếu bạn vừa đến đây, hãy đăng câu trả lời của bạn nếu bạn muốn!


2
Bạn có thể xem xét thêm một mệnh đề rằng tất cả các kết quả - Thắng, thua, hòa - phải có thể.
primo

Vì đây là sự nổi tiếng, tôi quyết định đồng hành cùng LOLZ
jdstankosky

Tôi đã chỉnh sửa các quy tắc trước khi bạn gửi câu trả lời của bạn. Phổ biến sẽ chỉ là người phá vỡ tie.
jsedano

1
Pfft, nó không còn phổ biến nữa? Nhàm chán.
jdstankosky

1
@anakata Theo quy tắc Perlgolf truyền thống (được biên soạn bởi không ai khác ngoài chính TonMedel) -psẽ được tính là 3 byte: một cho -, một cho p, và thêm một khoảng trắng cần thiết. Tuy nhiên, nhiều cuộc thi khác trên CG.SE đã tính mỗi tùy chọn là một byte đơn. Nó thường tùy thuộc vào tác giả của câu hỏi để quyết định tôn vinh hệ thống nào.
primo

Câu trả lời:


9

APL, 31

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

x←'rps'Gán chuỗi 'rps'chox

(?3)⌷ Chọn số nguyên ngẫu nhiên 1 ~ 3, chọn chỉ số đó là x

⍞, Chuẩn bị đầu vào của người dùng để lựa chọn máy

⎕← Chuỗi kết quả đầu ra

x⍳ Chuyển đổi sang mảng số bằng indexOf trong x

-/ Chênh lệch hai số

1+|3 Mô-đun 3 và cộng 1

'TWL'[...] lập chỉ mục từ 'TWL'

Mẫu vật

r
rp
L

Người dùng chọn đá, chương trình chọn giấy: Mất


42

LOLCODE, 1397

Chú thích: Tôi đã gửi điều này trước khi tôi nhận thấy yêu cầu chiến thắng đã được thay đổi từ mức độ phổ biến với môn đánh gôn sang chơi gôn với mức hòa vốn phổ biến.

Thực sự không có bất kỳ cú pháp nghiêm ngặt nào, nhưng tôi chắc chắn điều này có thể chấp nhận được.

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

Nếu điều này được thực hiện thành công như sau RockPaperScissors.LOL, thì đây là một số kết quả ngẫu nhiên có thể xảy ra:

  • Đầu vào: Rock- Đầu ra:I GUESSED SCIZZORS U WONNED
  • Đầu vào: Paper- Đầu ra:I GUESSED PAPER NOWAI TIED
  • Đầu vào: Scissors- Đầu ra:I GUESSED ROCK LOL U LOZED
  • Đầu vào: Tuna- Đầu ra:WHAT U SAYZ? YOU BURNTED MAH TREAT!

6
+1 chỉ vì là LOLCODE. Có vẻ như một cái gì đó tôi nên học đôi khi, chỉ dành cho LOLz.
Iszi

23

GolfScript

n"Draw"

Mã trên thực hiện các chức năng cần thiết. Ngoài ra, nó đảm bảo rằng người chơi sẽ không bao giờ bị tức giận vì sự không công bằng (nhận thức) về chiến lược của máy tính.

Phiên bản ung dung

n"Draw"

Làm thế nào để gọi chương trình

Đầu vào (một ký tự duy nhất của 'r', 'p', 's') phải được cung cấp trên STDIN, có thể kết thúc bằng dòng mới.

Chạy mẫu

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

Giải thích về mã

Đối với tất cả những người không quen thuộc với GolfScript, tôi sẽ thêm một lời giải thích chi tiết về cách mã này hoạt động. Mã về cơ bản tồn tại của ba phần.

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

Ghi chú

Vì đây không phải là môn đánh gôn, nhưng cuộc thi về sự nổi tiếng, tôi đã không chọn phiên bản ngắn nhất. Có thể trong trường hợp hòa, một mã ngắn hơn sẽ đánh bật giải pháp của tôi. Tuy nhiên, đối với những người thích chơi gôn, các khả năng sau đây được đưa ra:

  • Chỉ giao dịch với đầu vào thích hợp và buộc người dùng cung cấp một dòng mới. Điều này sẽ cứu một nhân vật.
  • Các quy tắc có một thiếu sót nhỏ cho phép cứu một nhân vật khác bằng cách bẻ cong các quy tắc. Kết quả luôn có thể được in là "Thắng" - không xác định rằng kết quả chính xác phải được in. Nhưng lưu ý rằng người chơi sẽ sớm nổi giận nếu bạn chọn thực hiện chương trình gian lận.
  • Các định dạng đầu ra không được chỉ định tốt. Chúng ta có thể chọn 0làm đầu ra để vẽ. Do đó, chương trình hợp lệ ngắn nhất là mã ký tự đơn 0.

1
OK, tôi đã thêm tính chi tiết cho các quy tắc! Tôi thừa nhận tôi đã phạm hai sai lầm tân binh.
jsedano

"Động thái chiến thắng duy nhất là không chơi." : P
Viezevingertjes

1
+1 cho phiên bản không được chỉnh sửa và lời giải thích thực sự tốt
izlin

Tôi đề nghị n"d", như câu hỏi nói rằng đầu ra phải là bất kỳ ký tự có thể in nào, nó không nói gì về việc sử dụng các từ đầy đủ.
ender_scythe 6/12/2016

20

Ruby: 61 54 ký tự

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

Bằng cách nào đó giải thích:

Toàn bộ vấn đề được giảm xuống để tính toán các kết quả sau:

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

Số có nghĩa là gì:

  • sự lựa chọn: 0 đá, 1 giấy, 2 kéo
  • kết quả: hòa 0, thắng 1, thua 2

Đối với điều này, tôi đã sử dụng công thức: machine_choice - human_choice. Điều này đôi khi dẫn đến giá trị âm, nhưng vì nó chỉ được sử dụng làm chỉ mục và chỉ số âm được tính ngược, sẽ chọn phần tử mảng chính xác.

# ┌── 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

Các phương thức đã sử dụng (những phương thức Fixnumrõ ràng khác):

  • Kernel.p (obj) → obj - Kiếm Đối với mỗi đối tượng, trực tiếp viết obj . inspecttheo sau là một dòng mới đến đầu ra tiêu chuẩn của chương trình.
  • Kernel.rand (max = 0) → số - Từ Nếu được gọi mà không có đối số hoặc nếu max.to_i.abs == 0, rand trả về số dấu phẩy động ngẫu nhiên giả giữa 0,0 và 1,0, bao gồm 0,0 và không bao gồm 1.0.
  • String.index (chuỗi con [, offset]) → fixnum hoặc nil - Triệu Trả về chỉ mục của lần xuất hiện đầu tiên của chuỗi con hoặc mẫu đã cho (regrec) trong str .

Ung dung:

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]

Chạy mẫu:

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"

1
Rất giống với tôi. [(c-o.index($_)+3)%3]có thể được thay thế bằng [c.-o.index$_]7 byte. Ngoài ra, bạn nên thêm hai vào điểm số của bạn -nlít nhất.
primo

1
Đừng! Đó là ý định đầu tiên của tôi, để sử dụng các chỉ số tiêu cực. Có vẻ như tôi đã quên thử lại phương pháp này sau khi khắc phục sự cố thứ tự toán hạng. Cảm ơn bạn, @primo. Và thêm một lời cảm ơn cho c.lời khuyên.
manatwork

Tôi phải nói rằng tôi thích câu trả lời này !!
jsedano

2
@manatwork các mẹo là thực sự .-. Toán tử chấm có độ ưu tiên thấp hơn nhiều so với các đối tác không chấm của chúng. Ví dụ, a/(b+c)có thể được thay thế bởi a./b+c.
primo

9

C # (167 ký tự)

Lần thử đầu tiên của tôi tại sân golf.

Chơi gôn

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

Không chơi gôn

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

Chạy mẫu Ứng dụng yêu cầu các đầu vào char duy nhất làm đối số 1 cho ứng dụng, hoặc r, shoặc p.

cmd > app.exe r

Tất cả các kết quả có thể

  • cmd > app.exe rcho đầu ra r T(rock, tie)
  • cmd > app.exe rcho đầu ra p L(giấy, bị mất)
  • cmd > app.exe rcho đầu ra s W(kéo, thắng)
  • cmd > app.exe pcho đầu ra r W(rock, win)
  • cmd > app.exe pcho đầu ra p T(giấy, cà vạt)
  • cmd > app.exe pcho đầu ra s L(kéo, mất)
  • cmd > app.exe scho đầu ra r L(đá, mất)
  • cmd > app.exe scho đầu ra p W(giấy, thắng)
  • cmd > app.exe scho đầu ra s T(kéo, buộc)

9

Perl 48 byte

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

Kịch bản in kết quả từ phối cảnh của máy tính, ví dụ: nếu người chơi chọn rvà máy tính chọn s, kết quả là Lose. $%(số trang định dạng) được sử dụng để lưu trữ di chuyển của máy tính, vì nó chỉ có thể chứa một giá trị số nguyên, giúp lưu một cụm từ int.

Ung dung:

# 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];

Sử dụng mẫu:

$ echo p | perl rps.pl
s
Win

$ echo r | perl rps.pl
r
Draw

$ echo s | perl rps.pl
p
Lose

Kịch bản cũng có thể được chạy tương tác, bằng cách nhập di chuyển của bạn theo sau Enter:

$ perl rps.pl
r
s
Lose

Quy tắc kéo dài

Perl 35 +3 byte

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

Yêu cầu -pchuyển đổi dòng lệnh (được tính là 3 byte). Mỗi phòng trong số kết quả Win, LoseDrawđã được ánh xạ tới W, L, D. Dòng mới giữa lựa chọn của máy tính và kết quả đã bị loại trừ.

Sử dụng mẫu:

$ echo r | perl -p rps.pl
sL

Perl 30 +3 byte

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

Một lần nữa yêu cầu -p. Ở đây Win, LoseDrawđã được ánh xạ tới 2, 10tương ứng. Điều này vẫn tuân thủ kỹ thuật, vì chúng là các ký tự có thể in được.

Sử dụng mẫu:

$ echo r | perl -p rps.pl
s1

Perl 24 +3 byte

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

Yêu cầu -p, WLD ánh xạ tới 2, 1, 0như trước đây. Mỗi cái ^Tnên được thay thế bằng một ký tự ascii theo nghĩa đen 20. Cái này được thừa nhận là một chút kéo dài; $^Ttrả về số giây kể từ epoch kể từ khi tập lệnh được bắt đầu. Tất cả các kết quả đều có thể, nhưng nó không hoàn toàn đủ điều kiện là giả ngẫu nhiên.

Sử dụng mẫu:

$ echo r | perl -p rps.pl
s1

7

APL ( 38 36)

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

Đầu ra 'T', 'W' và 'L' cho hòa, thắng và thua.

Chạy mẫu:

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

(Loại người dùng 'p' cho giấy. Máy tính chọn 'r' (rock), người dùng sẽ thắng)

Giải trình:

  • ⌽↑⌽∘'TWL'¨⍳3: tạo ma trận sau:
TLW
WTL
Lát
  • ⍞⍳⍨c←'rps': đặt thành cchuỗi 'rps', đọc đầu vào của người dùng và lấy chỉ mục của đầu vào của người dùng trong chuỗi (đây sẽ là giá trị từ 1 đến 3). Chỉ số này được sử dụng làm tọa độ Y vào ma trận.
  • i←?3: lấy số ngẫu nhiên từ 1 đến 3 và lưu nó vào i, đây là lựa chọn của máy tính. Điều này được sử dụng như tọa độ X vào ma trận.
  • c[i]: sử dụng ilàm chỉ mục vào c, hiển thị lựa chọn của máy tính là 'r', 'p' hoặc 's'.

6

ferNANDo 1184 (259 đánh gôn) byte

Một trình thông dịch viết bằng Python có thể được tìm thấy ở dưới cùng của trang được liên kết.

ferNANDo là một ngôn ngữ bí truyền chỉ hỗ trợ một loại biến, boolean và chỉ một thao tác, NAND. Như bạn có thể tưởng tượng, điều này có thể dẫn đến một số logic khá dài để thực hiện các nhiệm vụ có vẻ đơn giản. Nó có hỗ trợ đọc từ stdin (một byte mỗi lần), ghi vào stdout (cũng là một byte tại một thời điểm), các vòng lặp có điều kiện và cũng là một trình tạo boolean ngẫu nhiên.

Không có từ khóa nào; tất cả mọi thứ là một biến. Hàm của câu lệnh được xác định duy nhất bởi số lượng biến mà nó chứa. Cũng không có bình luận, vì vậy tôi đã cố gắng hết sức để làm cho mã tự nhận xét. Bốn dòng cuối cùng có thể hơi khó hiểu, nhưng có lẽ sẽ đủ để nói rằng nó inWin! , Losehoặc Drawtùy thuộc vào kết quả.

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

Kịch bản có thể được chạy tương tác, bằng cách gõ di chuyển của bạn theo sau Enter.

Sử dụng mẫu (giả sử bạn đã đặt tên cho trình thông dịch 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

Chỉnh sửa: Chỉ để chứng minh rằng ferNANDo có thể cạnh tranh với Java, đây là phiên bản 'được đánh gôn' với 259 byte . Logic rất khác nhau; nó kiểm tra not winnot tie, giúp lưu một vài cổng NAND (vì khi đó tôi chỉ cần các notphiên bản di chuyển của người chơi và vì not losekhông cần thiết cho đầu ra). Không gần như thú vị để đọc, mặc dù.

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

2
HAHAHA o_shi- o_shi- o_shi-Đây là tự nhận xét vui nhộn.
jdstankosky

1
@jdstankosky có lẽ là một chút phản ứng quá mức khi lăn a q, nhưng anh ấy làm điều hợp lý và reroll.
primo

5

Python 3.x: 74 Ký tự

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

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

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

Dựa trên số phận, nó quyết định lựa chọn nào nên dựa trên công thức

result = (User_choice + machines_fate) % no_of_choices

machine_choice = "psr"[result]

Phiên bản không chơi gôn

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)

Chạy mẫu

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

2
thú vị, quyết định trước kết quả, sau đó ném bất kỳ dấu hiệu nào để có kết quả đó ...
acolyte

1
Tôi không chắc thời gian tính bằng giây đủ điều kiện trong "lựa chọn chương trình ('r', 'p' hoặc 's') phải là giả ngẫu nhiên" . Một phần nghìn giây có lẽ sẽ, mặc dù.
primo

4

Lua, 87

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

Sử dụng:

$ lua rps.lua p
s   Defeat

Ung dung:

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)

Bạn có thể lưu 3 ký tự bằng cách sử dụng 'Lose' thay vì 'Đánh bại' và 'Tie' thay vì 'Draw'. ;)
Roddy of the Frozen Peas

4

GolfScript 62

Một giải pháp GolfScript thay thế, nhàm chán hơn nhiều so với Howard :).

Chương trình chọn di chuyển ngẫu nhiên và hiển thị kết quả từ quan điểm của người dùng.

Mật mã

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

Chạy mẫu

> tiếng vang s | ruby golfscript.rb rps.gs

"Mất"

Bài kiểm tra trực tuyến

Bạn có thể chạy chương trình và thử nghiệm với các đầu vào khác nhau tại đây: http://golfscript.apphb.com/?c=OydzJwoKJ3Jzc3BwcicuWzZyYW5kPV0nJys6wqdAKy4uJiwoez8pwq

Tuy nhiên, lưu ý rằng tham số (di chuyển người dùng) thường được truyền trong dòng lệnh hiện được thêm vào ngăn xếp trong chính mã (không có cách nào để cung cấp tham số dòng lệnh "thực" trong công cụ trực tuyến này).

Phiên bản "Ungolfed"

Tôi không có bất kỳ ý tưởng gì ungolfed phương tiện khi nói đến GolfScript, vì vậy tôi đã cố gắng để thêm ý kiến. Hy vọng rằng sẽ làm rõ cách thức hoạt động của mã và làm cho nó dễ đọc hơn một chút:

# 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

4

C, 92 86 ký tự

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

In lựa chọn của máy tính và kết quả theo quan điểm của người dùng - W = bạn thắng, L = bạn thua, T = hòa.
Công thức đơn giản x-y, được đưa ra các giá trị ASCII của các lựa chọn, cho 0 khi rút ra (rõ ràng) và một giá trị duy nhất trong các trường hợp khác.


4

Python 2 ( 86 84 80 78), Python 3 - 76 ký tự

0 - hòa, 1 - thua, 2 - thắng

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)

Ung dung

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

Cách chạy: python file_name_here.py

Sự cố:
AI máy tính: 35 ký tự


1
Tốt đẹp! Tôi không nghĩ rằng bạn cần Amặc dù, và bạn có thể lưu một char khác với from random import*.
grc

@grc: cảm ơn, tôi đã không thử from random, vì tôi nghĩ nó đã không thay đổi nó ...
beary605

Bạn có thể tách thêm 2 ký tự bằng cách thay đổi (a == b) * 2 thành (a! = B) và thay đổi kết quả thành "0-tie, 1-win, 2-thua"
Dhara

Xin lỗi, có nghĩa là "" hòa 0, thua 1, thắng 2 "
Dhara

@Dhara: Cảm ơn, sẽ không tìm ra điều đó. manatwork: Oh! Tôi sẽ sửa nó.
beary605

4

Đầu tiên thử mà không xem xét người khác.

đánh gôn: 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))

đầu ra là [npc-sự lựa chọn] [1: thắng, 2: thua, 3: hòa]

vô dụng:

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

4

PowerShell: 144 133 117 111 92 73

Thay đổi từ bản gốc:

  • Hoàn toàn viết lại kịch bản sau khi xem giải pháp chẵn hoặc lẻ ba người chơi của Danko Durbic .
  • Đã thay đổi $ s thành một chuỗi thay vì một mảng ký tự.
  • Đã sử dụng IndexOf như một phương thức trực tiếp trên $ s, thay vì đánh vần lớp .NET & phương thức.
  • Đã xóa %3s thừa .

Tất cả đã nói, gần như cắt giảm một nửa chiều dài từ câu trả lời ban đầu của tôi!

Mã đánh gôn:

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

Có thể chạy thẳng từ bàn điều khiển.

Ungolfed, với ý kiến:

# 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

Một số mẫu chạy tại bàn điều khiển:

nhập mô tả hình ảnh ở đây


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

Mã không được đánh giá cao:

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

Chạy mẫu:

C:> java cr

s: 1

C:> java cp

p: T

C:> java cs

s: T


3

Befunge: 107 ký tự

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

Hơi cồng kềnh. Nó có thể thu nhỏ, câu hỏi là bao nhiêu.


3

JavaScript (87)

Chơi gôn

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

Ung dung:

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

Bạn chỉ cần dán mã vào bảng điều khiển javascript của trình duyệt để chạy mã.

Nếu tôi được phép in kết quả trước khi in lựa chọn của máy tính (83) :

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

2

K, 67

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

In W, L, D để thắng / thua / hòa.

Ung dung:

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

Hoặc trong Q, dễ đọc hơn:

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

Chạy mẫu:

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"

2

Javascript, 117 ký tự

Đây là một cách tiếp cận dựa trên dữ liệu cho vấn đề. Điều này có thể được tối ưu hóa bằng cách tạo dữ liệu thắng / thua / rút thay vì ánh xạ thủ công, nhưng đó là một sự khởi đầu :)

Chơi gôn

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

Ung dung:

//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()]
);

Cuối cùng, đây là một câu đố với cả hai.


1

Javascript: 256

đánh gôn

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

vô dụng:

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

1

Áo choàng:

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

Phiên bản mini (129 ký tự mã):

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

1

JAVA (387) golf mã đầu tiên!

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

Ung dung

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 |
        +---------------+
     */
}

Chơi gôn (Khoảng cách / thụt lề)

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

Không phải mã ngắn nhất, nhưng lần thử đầu tiên của tôi


1
Một số cải tiến bạn có thể áp dụng: 1) import java.util.*2) HashMap l-> Map l3) cast (int)thay vì (Integer)4) new Random().nextInt(3)5) bỏ qua new int[][]6) loại bỏ cast thành (Character)7) sử dụng ints thay vì chars.
Howard

1

Đi (169)

Chơi gôn

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

Ungolfed (như được định dạng bởi 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])
}

Chạy :

chạy đi main.go p

S

W


1

Bình thường , 23

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

Đầu ra có dạng:

Tie: 0 Thắng: 1 Mất: 2

Giải trình:

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

Chạy như sau:

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

Chỉ có thêm 4 ký tự, chúng ta có thể sử dụng T cho hòa, W cho thắng và L cho thua:

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

Mọi thứ đều giống nhau cho đến khi có sự khác biệt của các chỉ mục, tại thời điểm đó chúng ta sử dụng sự khác biệt làm chỉ mục vào chuỗi "TWL".


Lưu ý: trong khi tôi đã phát triển ngôn ngữ này sau khi thử thách được đăng, tôi đã không thấy thử thách cho đến ngày hôm nay. Thách thức không ảnh hưởng đến bất kỳ khía cạnh nào của ngôn ngữ.


0

Groovy, 89

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

Đưa sự lựa chọn của người dùng làm đối số. Thí dụ:

groovy rps.groovy p
sL

0

C # & LinqPad 133

đánh gôn

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

vô dụng:

        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

đầu ra mẫu (đầu vào là s): r> L // Máy tính chọn rock (r) -> vì vậy chúng tôi đã mất


0

JavaScript (79)

Va chạm một cái cũ, nhưng ở đây chúng tôi đi ...

Với phần thưởng bổ sung mà bạn có thể sử dụng bất kỳ loại đá nào bạn thích như pegnatite, pyroxenite, scoria, sovite, kimberlite, trondjemite, tuff hoặc bất kỳ loại nào khác. Chỉ có một hạn chế là bạn không thể sử dụng phoặc s ;-)


Đầu vào:

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

Đầu ra:

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

Thí dụ:

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

Mã đánh gôn:

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

Các thủ thuật chính được sử dụng là:

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

       Sử dụng đối tượng {}và truy xuất giá trị theo đầu vào của người dùng prompt(). Càng xa càng tốt. Sau đó, thay vì có r : 0chúng ta có thể buộc nó được chuyển đổi 0bằng cách sử dụng ~~toán tử NOT. Nó thường được sử dụng để số sàn, nhưng cũng có (lợi thế) là không quay trở lại NaNkhi các nhà khai thác khác, ví dụ như : +{a:1, b:2}['c'].

2. c = new Date%3

       Ngày thường bị lừa bằng cách sử dụng +new Dateđể chuyển đổi nó thành dấu thời gian trực tiếp, người khác sẽ có được một chuỗi đại diện. Ở đây bằng cách sử dụng mod một đạt được hiệu quả tương tự.

3. 'rps'[c]

       Truy cập được lập chỉ mục trên chuỗi cho máy tính lựa chọn 0 = r, 1 = phoặc 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


...

Mã không mã hóa có thể là một cái gì đó như thế này:

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

0

Golfscript - 29

Đây là một câu trả lời thực tế lần này (nhìn vào bạn , n"Draw": P).

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

Ung dung:

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

Bạn có thể chạy nó với ruby golfscript.rb MyCode.txt, MyCode.txtmã chương trình ở đâu.

Chạy mẫu (tất cả đều có đầu vào "r", nhưng nó hoạt động với mọi thứ) (hòa là 0, thắng là 2, thua là 1):

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

Nếu bạn muốn giải thích về một trong hai phiên bản và / hoặc thấy một cải tiến tiềm năng, hãy cho tôi biết.


0

Javascript, 65 71 70

Không có đầu ra cho máy tính: 65

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

Chỉ cần kiểm tra giải pháp đó là chính xác:

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

Với đầu ra choise máy tính: 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]))

và bài kiểm tra:

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