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.

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.


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.

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

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

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.


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.


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.


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.


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)

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")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.