Gra w kości nieprzechodnie

10

Ci z was, którzy lubią Numberphile, znają dr Jamesa Grime'a, który opisał nieprzechodnie grę w kości na swoim kanale .

Gra składa się z trzech kostek o 6 twarzach:

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

Każdy z dwóch graczy wybiera kostkę do użycia. Rzucają je, a wyższa kostka wygrywa, najlepiej z czegokolwiek.

Prawdopodobnie, kostka 1 bije kostkę 2 z szansą> 50%. Podobnie, 2 uderzenia umierają 3, a co ciekawe, 3 uderzenia umierają 1.

Napisz podejmowania programu 1, 2lub 3jako wejście. Wskazuje kostkę wybraną przez użytkownika. Następnie program wybiera kostkę, która pokonałaby użytkownika i wyświetlał wyniki 21 rzutów, a „ Computer/User wins with x points

Zasady

  • Code-golf, głosuje jako remis
  • Musisz użyć RNG (lub polubień), aby faktycznie symulować rzuty kostką.
  • Nie jestem zbyt surowy w kwestii formatu wyjściowego. Jest w porządku, o ile pokazujesz kości, w jakiś sposób rozdzielasz 21 rzutów (w sposób odmienny od tego, w jaki sposób dzielisz kości w tym samym rzucie) i wypisujesz powyższe zdanie.
  • Dane wejściowe mogą być standardowe, argument linii poleceń, z ekranu itp.

Przykład

Wejście

1

Wynik

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

Tutaj użytkownik wybiera kostkę 1, a jego rzuty są pokazane w prawej kolumnie. Program wybiera kostkę 3 i bije go.

TwiNight
źródło

Odpowiedzi:

1

GolfScript, 112 105 znaków

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

Uruchom to online .

Skrypt oczekuje danych wejściowych STDIN, a następnie drukuje wyniki rzutów kostką (komputer z pierwszej kolumny, drugi użytkownik) i ostateczne statystyki do STDOUT.

Howard
źródło
4

APL ( 106 114)

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

Wyjaśnienie:

  • (↓5 6⍴545170074510753⊤⍨18⍴7)[⎕+⍳2]: Duża liczba to podstawowa 7 kości. Tworzymy macierz 6x5 zawierającą wartości kostek w kolejności: 2 3 1 2 3. Poproś użytkownika o dane wejściowe i dodaj je do wektora 1 2, a następnie wybierz te linie z macierzy. Ponieważ lista kości została przesunięta, użytkownik otrzymuje teraz tę, którą wybrał (po prawej), a komputer otrzymuje silniejszą.
  • {⍵[{?6}¨⍳21]}¨: wykonaj 21 rzutów dla każdej z tych dwóch kości.
  • ⎕←⍉↑: umieść rolki w formie matrycy i wyślij je.
  • Z←+/>/: uzyskaj wynik komputera (ilość razy wartość komputera była wyższa od użytkownika)
  • X←11>Z: ustaw, Xczy użytkownik wygrał (jeśli 11 jest wyższy niż wynik komputera).
  • 'Computer' 'User'[1+X]. Xjest to, czy użytkownik wygrał.
  • 'wins with','points',⍨|Z-21×X: Zto wynik komputera, więc jeśli komputer wygrał, wyświetl Z, w przeciwnym razie wyświetl 21-Z.
marinus
źródło
Wynik nie jest różnicą sum (oczekuje się, że będzie wynosić 0 dla wszystkich par kości), zamiast tego zwycięzca każdego z 21 rzutów otrzymuje 1 punkt. W tym przykładzie użytkownik ma 5 punktów (wygrywając 5 rzutów: 4-6, 1-3, 1-3, 1-3, 4-6), a komputer otrzymuje 16 punktów odpoczynku.
TwiNight
@TwiNight: naprawiono
marinus
Punkty ujemne, gdy użytkownik wygrywa. Możesz to naprawić |Z-21×X, nie zmieniając liczby
znaków
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")

Przykładowy przebieg:

> 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
źródło
Można wymienić summary.factorz table, oszczędzając 9 znaków.
Brian Diggs,
2

Mathematica 208 172 166 159

Dodano spacje dla przejrzystości

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]}}] &
Dr Belizariusz
źródło
Myślę, że wynik powinien zawierać wartości każdego rzutu kostką.
DavidC,
@ stary, zgubiłem to podczas testowania. Zrobiłem szybką naprawę, aby utrzymać piłkę w ruchu. Zastanowię się później, jak to poprawić.
Dr Belisarius
Teraz wydaje się, że działa dobrze.
DavidC,
@ koleś Znacznie lepiej teraz
dr belisarius
Bardzo miłe. +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 pobiera wartość ascii wejścia (tylko Ruby 1.8), co na szczęście jest przystające modulo 3 do jego wartości całkowitej.

szaczyna się od 21, więc s.times{code}wykona code21 razy i zwróci 21. Przy każdej iteracji pętla albo dodaje, albo odejmuje 1 od s, w zależności od tego, kto wygra, więc możemy zobaczyć, kto wygrał, sprawdzając, czy sskończył poniżej 21. , ale potrzebuję niezdarnego wyrażenia, [s/=2,21-s].maxaby wyodrębnić rzeczywistą liczbę punktów. Od dawna chciałem robić arytmetykę z wartością zwracaną <=>, więc i tak jestem szczęśliwy.

histocrat
źródło
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"}]}

Stosowanie

{Rzut gracza, rzut komputera}

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

wyniki


Wyjaśnienie

njest liczbą 1, 2 lub 3, która odpowiada kości gracza. Ponieważ n określa również (ale nie równa się) kość komputera, możemy wygenerować wszystkie możliwe rzuty kostką, gdy n = 1, n = 2, n = 3. Możemy również określić ich odpowiednie prawdopodobieństwa.

Sprawdź dane zaraz po RandomChoice:

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

Jeśli gracz losuje kostkę 1, jedynymi możliwymi wynikami są następujące 4 pary

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

Odpowiednie prawdopodobieństwa tych par są następujące

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

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

RandomChoice[<data>, 21] wyprowadza 21 rzutów dwóch kości.

DavidC
źródło
1

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

Odczytuje wybór użytkownika ze standardowego wejścia.

przestał się obracać w lewo
źródło
Kilka wskazówek: for(c=51-getchar(p=0);, printf("%ser wins), zmienić kolejność wyraz w rzacząć (i oszczędność miejsca.
ugoren
I jeszcze więcej: (c+1)%3-> -~c%3, ustaw pstatyczny (inicjowany na 0), usuń {}po for( ;-> ,w nich), użyj p<11?:dwa razy w printfśrodku zamiast przypisywania p,q.
ugoren,
I możesz ustawić s,qw pętli printf, a pnastępnie zwiększać , oszczędzając w ten sposób nawiasy. Zmień także cprzypisanie do użycia %3lub %7, podając inną kolejność 0,1,2.
ugoren,
1

Czynnik

Zawiera: 388

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

Tak, Factor nie jest tak naprawdę językiem używanym podczas gry w golfa, ale jest fajny.

Matthew Rolph
źródło
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
źródło
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
źródło