Trò chơi súc sắc không chuyển tiếp


10

Những người bạn thích Numberphile sẽ quen thuộc với Tiến sĩ James Grime, người đã mô tả một trò chơi súc sắc không chuyển tiếp trên kênh của mình .

Trò chơi bao gồm ba con xúc xắc 6 mặt:

  • Chết 1: 3,3,3,3,3,6
  • Chết 2: 2,2,2,5,5,5
  • Chết 3: 1,4,4,4,4,4

Hai người chơi chọn một die để sử dụng. Họ lăn chúng và chết cao hơn, tốt nhất là bất cứ điều gì.

Xác suất, chết 1 nhịp chết 2 với cơ hội> 50%. Tương tự, chết 2 nhịp chết 3, và thật thú vị, chết 3 nhịp chết 1.

Viết một chương trình tham gia 1, 2hoặc 3làm đầu vào. Điều này chỉ ra cái chết mà người dùng chọn. Chương trình sau đó chọn súc sắc sẽ đánh bại người dùng và đưa ra kết quả của 21 cuộn và " Computer/User wins with x points"

Quy tắc

  • Code-golf, phiếu bầu là tiebreaker
  • Bạn phải sử dụng RNG (hoặc lượt thích) để thực sự mô phỏng các cuộn súc sắc.
  • Tôi không quá khắt khe về định dạng đầu ra. Không sao miễn là bạn hiển thị các con xúc xắc, bằng cách nào đó tách biệt giữa 21 cuộn (theo cách khác với cách bạn tách xúc xắc trong cùng một cuộn) và xuất câu đó ở trên.
  • Đầu vào có thể là stdin, đối số dòng lệnh, từ màn hình, v.v.

Thí dụ

Đầu vào

1

Đầu ra

4 3
4 3
4 3
4 3
4 3
4 3
4 3
4 3
4 3
4 6
1 3
4 3
4 3
1 3
4 3
1 3
4 3
4 3
4 3
4 3
4 6
 Computer wins with 16 points

Ở đây, người dùng chọn die 1 và cuộn của anh ta được hiển thị trên cột bên phải. Chương trình chọn chết 3 và đánh bại anh ta.

Câu trả lời:


1

GolfScript, 112 105 ký tự

3,21*{..+6rand<3*+)}%3/\{)\.+-1%>2<.p~<}+,,"User
Computer"n/1$11<=" wins with "+\[.~22+]$1>~+" points"+

Chạy nó trực tuyến .

Kịch bản dự kiến ​​đầu vào trên STDIN và sau đó in kết quả của các cuộn súc sắc (máy tính cột đầu tiên, người dùng thứ hai) và số liệu thống kê cuối cùng thành STDOUT.


4

APL ( 106 114)

'Computer' 'User'[1+X],'wins with','points',⍨|Z-21×X←11>Z←+/>/⎕←⍉↑{⍵[{?6}¨⍳21]}¨(↓5 6⍴545170074510753⊤⍨18⍴7)[⎕+⍳2]

Giải trình:

  • (↓5 6⍴545170074510753⊤⍨18⍴7)[⎕+⍳2]: Số lớn là đại diện cơ sở 7 của súc sắc. Chúng tôi tạo một ma trận 6x5 chứa các giá trị của súc sắc theo thứ tự: 2 3 1 2 3. Yêu cầu người dùng nhập và thêm phần này vào vectơ 1 2và chọn các dòng này từ ma trận. Bởi vì danh sách xúc xắc được thay đổi, giờ đây người dùng sẽ nhận được con súc sắc mình chọn (bên phải) và máy tính sẽ mạnh hơn.
  • {⍵[{?6}¨⍳21]}¨: làm 21 cuộn cho mỗi hai con xúc xắc này.
  • ⎕←⍉↑: đặt các cuộn ở dạng ma trận và xuất chúng.
  • Z←+/>/: lấy số điểm của máy tính (số lần giá trị của máy tính cao hơn người dùng)
  • X←11>Z: được đặt Xthành liệu người dùng có chiến thắng hay không (nếu 11 cao hơn điểm số của máy tính).
  • 'Computer' 'User'[1+X]. Xlà người dùng có chiến thắng hay không.
  • 'wins with','points',⍨|Z-21×X: Zlà điểm của máy tính, vì vậy nếu máy tính giành được hiển thị Z, nếu không thì hiển thị 21-Z.

Điểm số không phải là sự khác biệt của tổng số (dự kiến ​​là 0 cho tất cả các cặp súc sắc), thay vào đó, người chiến thắng của mỗi trong số 21 cuộn được 1 điểm. Trong ví dụ, người dùng có 5 điểm (từ chiến thắng 5 cuộn: 4-6, 1-3, 1-3, 1-3, 4-6) và máy tính được nghỉ 16 điểm.
TwiNight

@TwiNight: cố định nó
marinus

Điểm tiêu cực khi người dùng chiến thắng. Bạn có thể khắc phục bằng cách |Z-21×Xkhông thay đổi số char
TwiNight

2

R - 228

d=matrix(rep(c(rep(3,5),6,2,2,2,5,5,5,1,rep(4,5)),2),6)
x=scan()
r=expand.grid(Computer=d[,x+2],User=d[,x])[sample(36,21,T),]
print(r)
s=summary.factor(names(r)[max.col(r)])
cat(names(which.max(s)),"wins with",max(s),"points\n")

Chạy ví dụ:

> source('ntd.R')
1: 2
2: 
Read 1 item
     Computer User
28          3    5
31          3    5
36          6    5
18          6    2
11          3    2
31.1        3    5
14          3    2
8           3    2
9           3    2
17          3    2
2           3    2
29          3    5
3           3    2
16          3    2
4           3    2
21          3    5
14.1        3    2
23          3    5
16.1        3    2
17.1        3    2
19          3    5
Computer wins with 14 points

Bạn có thể thay thế summary.factorbằng table, lưu 9 ký tự.
Brian Diggs

2

Toán học 208 172 166 159

Không gian được thêm vào cho rõ ràng

b=Boole;{#, Row@{
         If[# > 10, "Play", "Comput"], "er wins with ",
         Max[#, 21 - #], " points"} &@ Total[b[#1 > #2] & @@@ #]} &@
   Table[1 + i + 3 b[6 Random[] > 2 i + 1],{21}, {i, {#, Mod[# + 1, 3]}}] &

Tôi nghĩ rằng đầu ra được cho là liệt kê các giá trị của mỗi lần tung xúc xắc.
DavidC

@dude yep, tôi đã mất nó trong khi thử nghiệm. Tôi đã thực hiện một sửa chữa nhanh chóng chỉ để giữ cho bóng chạy. Sau này tôi sẽ nghĩ cách cải thiện nó.
Tiến sĩ belisarius

Bây giờ có vẻ như đang làm việc tốt.
DavidC

@dude Tốt hơn nhiều bây giờ
Tiến sĩ belisarius

Thực sự tốt đẹp. +1
Mr.Wizard

1

Hồng ngọc 1.8, 165

i,s,*d=getc,21,[4]*5<<1,[3]*5<<6,[2,5]*3
puts"#{s.times{p r=[i,i-1].map{|o|d[o%3][rand 6]};s+=r[0]<=>r[1]}>s?"Human":"Computer"} wins with #{[s/=2,21-s].max} points"

getc nhận giá trị ascii của đầu vào (chỉ ruby ​​1.8), rất vui là modulo 3 đồng dạng với giá trị nguyên của nó.

sbắt đầu từ 21, vì vậy s.times{code}sẽ thực hiện code21 lần và trả về 21. Trên mỗi lần lặp, vòng lặp sẽ cộng hoặc trừ 1 từ s tùy thuộc vào người chiến thắng, vì vậy chúng ta có thể xem ai thắng bằng cách xem liệu sđã kết thúc dưới 21. Cho đến nay , nhưng sau đó tôi cần biểu thức vụng về [s/=2,21-s].maxđể trích xuất số điểm thực tế. Từ lâu tôi đã muốn làm số học với giá trị trả về <=>, vì vậy dù sao tôi cũng rất vui.


1

Toán học 234 247

g@n_ := {t = RandomChoice[{{5, 25, 1, 5}/36 -> {{3, 1}, {3, 4}, {6, 1}, {6, 4}}, 
         {5, 1, 5, 1}/12 -> {{2, 3}, {2, 6}, {5, 3}, {5, 6}},
         {1, 1, 5, 5}/12 -> {{1, 2}, {1, 5}, {4, 2}, {4, 5}}}[[n]], 21], 
         Row[{If[(c = Count[t, {x_, y_} /; y > x]) > 10, "Computer ", "Player "], 
         "wins with ", If[c > 10, c, 21 - c], " points"}]}

Sử dụng

{Cuộn cuộn, cuộn máy tính}

g[1]
g[2]
g[3]

các kết quả


Giải trình

nlà số 1, 2 hoặc 3 tương ứng với điểm chết của người chơi. Vì n cũng xác định (nhưng không bằng) cái chết của máy tính, chúng ta có thể tạo ra tất cả các cuộn xúc xắc có thể có khi n = 1, n = 2, n = 3. Chúng tôi cũng có thể xác định xác suất tương ứng của họ.

Kiểm tra dữ liệu ngay sau RandomChoice:

{5, 25, 1, 5} / 36 -> {{3, 1}, {3, 4}, {6, 1}, {6, 4}}

Nếu người chơi rút được 1 chết, kết quả duy nhất có thể xảy ra là 4 cặp sau

{{3, 1}, {3, 4}, {6, 1}, {6, 4}}

Xác suất tương ứng của các cặp này là

{5, 25, 1, 5}/36, đó là,

{5/36, 25/36, 1/36, 5/36}

RandomChoice[<data>, 21] đầu ra 21 cuộn của hai con xúc xắc.


1

C, 205 191

p;r(c){return 1+c+3*(rand()%6>2*c);}main(i,c,q,s){for(c=51-getchar();++i<23;printf("%u %u\n",q,s))q=r(c),p+=(s=r(-~c%3))<q;printf("%ser wins with %u points",p<11?"Comput":"Us",p<11?21-p:p);}

Đọc sự lựa chọn của người dùng từ stdin.


Một số mẹo : for(c=51-getchar(p=0);, printf("%ser wins), sắp xếp lại biểu thức rđể bắt đầu (và tiết kiệm dung lượng.
xấu xí

Và hơn thế nữa: (c+1)%3-> -~c%3, tạo ptĩnh (khởi tạo thành 0), xóa {}sau for( ;-> ,bên trong chúng), sử dụng p<11?:hai lần trong printfthay vì gán p,q.
xấu xí

Và bạn có thể đặt s,qtrong vòng lặp printfvà tăng dần psau đó, do đó lưu dấu ngoặc đơn. Đồng thời thay đổi cbài tập để sử dụng %3hoặc %7, đưa ra một thứ tự khác 0,1,2.
xấu xí

1

Hệ số

Bao gồm: 388

Không có: 300

USING: arrays formatting io kernel math math.parser prettyprint random sequences ;
IN: N
CONSTANT: d { { 3 3 3 3 3 6 } { 2 2 2 5 5 5 } { 1 4 4 4 4 4 } }
: p ( -- ) 1 read string>number [ 3 mod 1 + ] keep [ 1 - d nth ] bi@ 2array 21 iota [ drop first2 [ random ] bi@ [ 2array . ] 2keep < ] with map [ ] count [ 11 > "Comput" "Play" ? ] [ "er wins with %d points" sprintf ] bi append print ;

Vâng, Factor không thực sự là ngôn ngữ để sử dụng khi chơi golf, nhưng nó rất hay.


0

Con trăn 182

from random import*
u=2+input()
r=[eval("int(choice(`0x1d67e987c0e17c9`[i%3::3])),"*21)for i in(u,u-1)]
U,C=map(sum,r)
print r,['Us','Comput'][U<C]+'er wins with %d points'%abs(U-C)

0

R 206

u=scan()
D=list(c(rep(3,5),6),c(2,5),c(1,rep(4,5)))
S=sample
U=S(D[[u]],21,T)
C=S(D[[(u+1)%%3+1]],21,T)
print(cbind(U,C))
W=sum(U>C)
I=(W>10)+1
cat(c("Computer","User")[I],"wins with",c(21-W,W)[I],"points")
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.