Game dadu non-transitif

10

Anda yang menyukai Numberphile akan mengenal Dr. James Grime, yang menggambarkan permainan dadu non-transitif di salurannya .

Permainan ini terdiri dari tiga dadu bermuka 6:

  • Mati 1: 3,3,3,3,3,6
  • Mati 2: 2,2,2,5,5,5
  • Mati 3: 1,4,4,4,4,4

Dua pemain masing-masing memilih mati untuk digunakan. Mereka menggulung mereka dan die yang lebih tinggi menang, apa pun yang terjadi.

Kemungkinan, mati 1 ketukan mati 2 dengan peluang> 50%. Demikian pula, mati 2 ketukan mati 3, dan, yang menarik, mati 3 ketukan mati 1.

Tulis pengambilan program 1, 2atau 3sebagai masukan. Ini menunjukkan die yang dipilih pengguna. Program kemudian memilih dadu yang akan mengalahkan pengguna dan menghasilkan hasil 21 gulungan, dan " Computer/User wins with x points"

Aturan

  • Code-golf, memilih sebagai tiebreak
  • Anda harus menggunakan RNG (atau sejenisnya) untuk benar-benar mensimulasikan gulungan dadu.
  • Saya tidak terlalu ketat pada format output. Tidak apa-apa selama Anda menunjukkan dadu, entah bagaimana memisahkan antara 21 gulungan (dengan cara yang berbeda dari cara Anda memisahkan dadu dalam gulungan yang sama), dan mengeluarkan kalimat itu di atas.
  • Input dapat berupa stdin, argumen baris perintah, dari layar, dll.

Contoh

Memasukkan

1

Keluaran

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

Di sini, pengguna memilih die 1 dan gulungannya ditampilkan pada kolom kanan. Program memilih die 3 dan mengalahkannya.

TwiNight
sumber

Jawaban:

1

GolfScript, 112 105 karakter

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

Jalankan secara online .

Script mengharapkan input pada STDIN dan kemudian mencetak hasil gulungan dadu (komputer kolom pertama, pengguna kedua) dan statistik akhir ke STDOUT.

Howard
sumber
4

APL ( 106 114)

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

Penjelasan:

  • (↓5 6⍴545170074510753⊤⍨18⍴7)[⎕+⍳2]: Angka besar adalah representasi basis-7 dari dadu. Kami membuat matriks 6x5 yang berisi nilai-nilai dadu dalam urutan: 2 3 1 2 3. Minta input pengguna dan tambahkan ini ke vektor 1 2, dan pilih garis-garis ini dari matriks. Karena daftar dadu digeser, pengguna sekarang mendapatkan yang ia pilih (di sebelah kanan) dan komputer mendapatkan yang lebih kuat.
  • {⍵[{?6}¨⍳21]}¨: lakukan 21 gulungan untuk masing-masing dua dadu ini.
  • ⎕←⍉↑: meletakkan gulungan dalam bentuk matriks dan output mereka.
  • Z←+/>/: dapatkan skor komputer (berapa kali nilai komputer lebih tinggi dari pengguna)
  • X←11>Z: setel Xapakah pengguna menang (jika 11 lebih tinggi dari skor komputer).
  • 'Computer' 'User'[1+X]. Xadalah apakah pengguna menang.
  • 'wins with','points',⍨|Z-21×X: Zadalah skor komputer, jadi jika komputer menang layar Z, jika tidak ditampilkan 21-Z.
marinus
sumber
Skor bukan perbedaan dari total (yang diharapkan menjadi 0 untuk semua pasangan dadu), sebagai gantinya, pemenang dari masing-masing 21 gulungan mendapatkan 1 poin. Dalam contoh, pengguna memiliki 5 poin (dari memenangkan 5 gulungan: 4-6, 1-3, 1-3, 1-3, 1-3, 4-6) dan komputer mendapatkan sisa 16 poin.
TwiNight
@TwiNight: perbaiki
marinus
Poin negatif ketika pengguna menang. Anda dapat memperbaikinya dengan |Z-21×Xyang tidak mengubah hitungan 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")

Contoh dijalankan:

> 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
Geoff Reedy
sumber
Anda dapat mengganti summary.factordengan table, menghemat 9 karakter.
Brian Diggs
2

Mathematica 208 172 166 159

Spaces ditambahkan untuk kejelasan

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]}}] &
Belisarius
sumber
Saya pikir output seharusnya mencantumkan nilai dari setiap gulungan dadu.
DavidC
@ Bung ya, saya kehilangan itu saat pengujian. Saya melakukan perbaikan cepat hanya untuk menjaga bola tetap berjalan. Saya akan pikirkan nanti bagaimana memperbaikinya.
Dr. belisarius
Sekarang tampaknya berfungsi dengan baik.
DavidC
@ Bung Jauh lebih baik sekarang
Dr. belisarius
Benar-benar bagus. +1
Mr.Wizard
1

Ruby 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 mendapat nilai ascii dari input (ruby 1.8 saja), yang dengan senang hati adalah modulo 3 kongruen dengan nilai integernya.

sdimulai pada 21, jadi s.times{code}akan mengeksekusi code21 kali dan kembali 21. Pada setiap iterasi, loop dapat menambah atau mengurangi 1 dari s tergantung pada siapa yang menang, sehingga kita dapat melihat siapa yang menang dengan melihat apakah stelah berakhir di bawah 21. Rapi sejauh ini , tapi kemudian saya perlu ekspresi canggung [s/=2,21-s].maxuntuk mengekstrak jumlah poin yang sebenarnya. Saya sudah lama ingin melakukan aritmatika dengan nilai pengembalian <=>, jadi saya senang pula.

histokrat
sumber
1

Mathematica 234 247

Kode

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

Pemakaian

{Gulungan pemain, Gulungan komputer}

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

hasil


Penjelasan

nadalah angka 1, 2, atau 3 yang sesuai dengan dadu pemain. Karena n juga menentukan (tetapi tidak sama dengan) dadu komputer, kita dapat menghasilkan semua kemungkinan gulungan dadu ketika n = 1, n = 2, n = 3. Kami juga dapat menentukan probabilitas masing-masing.

Periksa data segera setelah RandomChoice:

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

Jika pemain imbang 1 mati, satu-satunya hasil yang mungkin adalah 4 pasang berikut

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

Probabilitas masing-masing pasangan ini adalah

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

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

RandomChoice[<data>, 21] menghasilkan 21 gulungan dari dua dadu.

DavidC
sumber
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);}

Membaca pilihan pengguna dari stdin.

berhenti mengubah counterclockwis
sumber
Beberapa tips: for(c=51-getchar(p=0);, printf("%ser wins), ekspresi menyusun ulang di rmulai dengan (dan menghemat ruang.
ugoren
Dan banyak lagi: (c+1)%3-> -~c%3, buat pstatis (diinisialisasi ke 0), hapus {}setelah for( ;-> ,di dalamnya), gunakan p<11?:dua kali di dalam printfalih-alih menetapkan p,q.
ugoren
Dan Anda dapat mengatur s,qdalam lingkaran printf, dan kenaikan psetelahnya, sehingga menghemat tanda kurung. Juga mengubah ctugas untuk menggunakan %3atau %7, memberikan urutan 0,1,2 yang berbeda.
ugoren
1

Faktor

Dengan termasuk: 388

Tanpa: 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 ;

Ya, Factor sebenarnya bukan bahasa yang digunakan saat bermain golf, tapi menyenangkan.

Matthew Rolph
sumber
0

Python 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)
daniero
sumber
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")
flodel
sumber