Geçişsiz zar oyunu


10

Numberphile'ı beğenenler, kanalında geçişsiz bir zar oyunu tanımlayan Dr. James Grime'ı tanıyacaksınız .

Oyun üç adet 6 yüzlü zardan oluşur:

  • Ölüm 1: 3,3,3,3,3,6
  • Kalıp 2: 2,2,2,5,5,5
  • Ölüm 3: 1,4,4,4,4,4

İki oyuncu her biri kullanmak için bir kalıp seçer. Onları yuvarlarlar ve ne kadar yüksek olursa o kadar kazanırlar.

Muhtemelen, ölmek 1 yener ölür 2>% 50 şans ile. Benzer şekilde, kalıp 2 vuruşları kalıp 3 ve ilginç bir şekilde kalıp 3 vuruşlar kalıp 1.

Bir program alma yaz 1, 2veya 3girdi olarak. Bu kullanıcının seçtiği kalıbı gösterir. Program daha sonra kullanıcıyı yenecek ve 21 rulo sonucunu verecek kalıbı seçiyor ve " Computer/User wins with x points"

kurallar

  • Kod golf, tiebreaker oyları
  • Zar zarlarını simüle etmek için RNG (veya benzeri) kullanmalısınız.
  • Çıktı biçiminde çok katı değilim. Zarları gösterdiğiniz sürece, 21 rulo arasında (zarları aynı ruloda nasıl ayırdığınızdan farklı bir şekilde) ayırın ve yukarıdaki cümleyi çıkarın.
  • Giriş stdin, komut satırı argümanı, ekrandan vb. Olabilir.

Misal

Giriş

1

Çıktı

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

Burada, kullanıcı kalıp 1'i seçer ve ruloları sağ sütunda gösterilir. Program ölmek 3 seçer ve onu yener.

Yanıtlar:


1

GolfScript, 112 105 karakter

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

Çevrimiçi çalıştırın .

Komut dosyası STDIN'deki girdiyi bekler ve daha sonra zar atışlarının sonucunu (ilk sütun bilgisayar, ikinci kullanıcı) ve son istatistikleri STDOUT'a yazdırır.


4

APL ( 106 114),

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

Açıklama:

  • (↓5 6⍴545170074510753⊤⍨18⍴7)[⎕+⍳2]: Büyük sayı zarın temel 7 temsilidir. Zar değerlerini sırayla içeren 6x5'lik bir matris yapıyoruz: 2 3 1 2 3. Kullanıcı girişini isteyin ve bunu vektöre ekleyin 1 2ve bu çizgileri matristen seçin. Zar listesi değiştiğinden, kullanıcı şimdi seçtiği (sağda) ve bilgisayar daha güçlü olanı alır.
  • {⍵[{?6}¨⍳21]}¨: bu iki zarın her biri için 21 rulo yapın.
  • ⎕←⍉↑: ruloları matris formuna koyun ve çıktısını alın.
  • Z←+/>/: bilgisayarın puanını al (bilgisayarın değerinin kullanıcıdan daha yüksek olduğu miktar)
  • X←11>Z: Xkullanıcının kazanıp kazanmayacağına ayarlayın (11 bilgisayarın puanından yüksekse).
  • 'Computer' 'User'[1+X]. Xkullanıcının kazanıp kazanmadığıdır.
  • 'wins with','points',⍨|Z-21×X: Zbilgisayarın puanıdır, bu nedenle bilgisayar ekranı kazanırsa Z, aksi halde görüntülenir 21-Z.

Skor, toplam zar farkı değildir (tüm zar çiftleri için 0 olması beklenir), bunun yerine 21 rulonun her birinin kazananı 1 puan alır. Örnekte, kullanıcının 5 puanı vardır (5 rulo kazanarak: 4-6, 1-3, 1-3, 1-3, 4-6) ve bilgisayar 16 puanı dinlendirir.
TwiNight

@TwiNight: düzeltildi
marinus

Kullanıcı kazandığında negatif puan. |Z-21×XChar sayısını değiştirmeyen düzeltme yapabilirsiniz
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")

Örnek çalışma:

> 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

Sen yerini alabilir summary.factorile table9 karakterleri tasarruf.
Brian Diggs

2

Mathematica 208 172 166 159

Netlik için alanlar eklendi

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

Bence çıktının her zarın değerini listelemesi gerekiyor.
DavidC

@dude evet, test ederken kaybettim. Sadece topun çalışmasını sağlamak için hızlı bir düzeltme yaptım. Daha sonra nasıl geliştirileceğini düşüneceğim.
Dr. belisarius

Şimdi iyi çalışıyor gibi görünüyor.
DavidC

@dude Çok daha iyi
Dr. belisarius

Gerçekten hoş. +1
Mr.Wizard

1

Yakut 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 mutlulukla tamsayı değerine uyumlu modulo 3 olan girişin ascii değerini alır (sadece yakut 1.8).

s21'de başlar, 21 kez s.times{code}yürütülür codeve 21 döndürür. Her yinelemede, döngü kimin kazandığına bağlı olarak s'yi 1'den ekler veya çıkarır, böylece s21'in altında olup olmadığını görerek kimin kazandığını görebiliriz . , ama sonra [s/=2,21-s].maxpuan gerçek sayı elde etmek için beceriksiz ifade gerekir . Uzun zamandır dönüş değeri ile aritmetik yapmak istedim <=>, bu yüzden yine de mutluyum.


1

Mathematica 234 247

kod

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

kullanım

{Oyuncu rulosu, Bilgisayar rulosu}

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

Sonuçlar


açıklama

noyuncunun ölmesine karşılık gelen 1, 2 veya 3 sayısıdır. N ayrıca bilgisayarın kalıbını da belirlediğinden (ancak eşit olmadığından), n = 1, n = 2, n = 3 olduğunda zarın tüm olası rulolarını üretebiliriz. Ayrıca kendi olasılıklarını da belirleyebiliriz.

Verileri hemen inceleyin RandomChoice:

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

Oyuncu 1. kalıbı çekerse, olası tek sonuç aşağıdaki 4 çifttir

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

Bu çiftlerin ilgili olasılıkları

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

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

RandomChoice[<data>, 21] iki zar 21 rulo çıktı.


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

Kullanıcının stdin'den seçimini okur.


Bazı ipuçları: for(c=51-getchar(p=0);, printf("%ser wins), içinde sipariş ifadesi rile başlamak (ve uzay tasarruf.
ugoren

Ve dahası: (c+1)%3-> -~c%3, pstatik yapın (0 olarak başlatıldı), {}sonra kaldırın for( ;-> ,içinde), atamak yerine p<11?:iki kez kullanın . printfp,q
ugoren

Ve s,qdöngüye girebilir printfve pdaha sonra artırabilir , böylece parantezleri kaydedebilirsiniz . Ayrıca ckullanılacak ödevi değiştirin %3veya %7farklı bir 0,1,2 sırası verin.
ugoren

1

faktör

İçeren: 388

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

Evet, Factor golf yaparken kullanılacak dil değil, ama güzel.


0

Piton 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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.