Gioco di dadi non transitivo


10

Quelli di voi a cui piace Numberphile avrebbero familiarità con il Dr. James Grime, che ha descritto un gioco di dadi non transitivo sul suo canale .

Il gioco consiste in tre dadi a 6 facce:

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

Due giocatori scelgono ciascuno un dado da usare. Li lancia e vince il dado più alto, il migliore di qualunque cosa.

Probabilmente, muori 1 battiti muori 2 con una probabilità> 50%. Allo stesso modo, die 2 beat muore 3 e, cosa interessante, die 3 beat muore 1.

Scrivi una presa programma 1, 2o 3come input. Questo indica il dado scelto dall'utente. Il programma quindi sceglie il dado che batterebbe l'utente e produrrebbe i risultati di 21 tiri, e " Computer/User wins with x points"

Regole

  • Code-golf, voti come tiebreaker
  • Devi usare RNG (o simili) per simulare effettivamente i tiri di dado.
  • Non sono troppo severo sul formato di output. Va bene purché mostri i dadi, in qualche modo separati tra i 21 tiri (in un modo diverso da come separi i dadi nello stesso tiro) e produci quella frase sopra.
  • L'input può essere stdin, argomento della riga di comando, dallo schermo, ecc.

Esempio

Ingresso

1

Produzione

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

Qui, l'utente sceglie il dado 1 e i suoi tiri sono mostrati nella colonna di destra. Il programma sceglie die 3 e lo batte.

Risposte:


1

GolfScript, 112 105 caratteri

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

Eseguilo online .

Lo script attende l'input su STDIN e quindi stampa il risultato dei tiri di dado (computer della prima colonna, secondo utente) e le statistiche finali su 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]

Spiegazione:

  • (↓5 6⍴545170074510753⊤⍨18⍴7)[⎕+⍳2]: Il grande numero è una rappresentazione base-7 dei dadi. Realizziamo una matrice 6x5 contenente i valori dei dadi nell'ordine: 2 3 1 2 3. Richiedi l'input dell'utente, aggiungilo al vettore 1 2e seleziona queste linee dalla matrice. Poiché l'elenco dei dadi viene spostato, l'utente ora ottiene quello che ha selezionato (a destra) e il computer ottiene quello più forte.
  • {⍵[{?6}¨⍳21]}¨: effettua 21 tiri per ciascuno di questi due dadi.
  • ⎕←⍉↑: mette i rotoli in forma di matrice e li genera.
  • Z←+/>/: ottiene il punteggio del computer (il numero di volte in cui il valore del computer è stato superiore a quello dell'utente)
  • X←11>Z: imposta Xse l'utente ha vinto (se 11 è superiore al punteggio del computer).
  • 'Computer' 'User'[1+X]. Xè se l'utente ha vinto.
  • 'wins with','points',⍨|Z-21×X: Zè il punteggio del computer, quindi se il computer ha vinto display Z, altrimenti visualizza 21-Z.

Il punteggio non è la differenza dei totali (che dovrebbe essere 0 per tutte le coppie di dadi), invece, il vincitore di ciascuno dei 21 tiri ottiene 1 punto. Nell'esempio, l'utente ha 5 punti (vincendo 5 tiri: 4-6, 1-3, 1-3, 1-3, 4-6) e il computer ottiene il riposo di 16 punti.
TwiNight,

@TwiNight: risolto
Marinus

Punti negativi quando l'utente vince. Puoi risolvere con |Z-21×Xciò che non cambia il conteggio dei caratteri
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")

Esempio di esecuzione:

> 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

È possibile sostituire summary.factorcon table, salvando 9 caratteri.
Brian Diggs,

2

Mathematica 208 172 166 159

Spazi aggiunti per maggiore chiarezza

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

Penso che l'output dovrebbe elencare i valori di ogni lancio di dadi.
DavidC

@dude sì, l'ho perso durante il test. Ho fatto una rapida correzione solo per mantenere la palla in esecuzione. In seguito ci penserò su come migliorarlo.
Dr. belisarius,

Ora sembra funzionare bene.
DavidC

@dude Molto meglio ora
Dr. belisarius,

Veramente bello. +1
Mr.Wizard,

1

Rubino 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 ottiene il valore ascii dell'input (solo ruby ​​1.8), che fortunatamente è congruente modulo 3 al suo valore intero.

sinizia alle 21, quindi s.times{code}verrà eseguito code21 volte e restituirà 21. Ad ogni iterazione, il ciclo aggiunge o sottrae 1 da s in base a chi vince, quindi possiamo vedere chi ha vinto vedendo se sè finito sotto 21. Fin qui , ma poi ho bisogno dell'espressione goffa [s/=2,21-s].maxper estrarre il numero effettivo di punti. Ho desiderato a lungo fare l'aritmetica con il valore di ritorno di <=>, quindi sono comunque felice.


1

Mathematica 234 247

Codice

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

uso

{Lancio del giocatore, Lancio del computer}

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

risultati


Spiegazione

nè il numero 1, 2 o 3 che corrisponde al dado del giocatore. Poiché n determina anche (ma non è uguale) il dado del computer, possiamo generare tutti i possibili tiri di dado quando n = 1, n = 2, n = 3. Possiamo anche determinare le loro rispettive probabilità.

Esamina i dati subito dopo RandomChoice:

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

Se il giocatore pesca un dado 1, gli unici risultati possibili sono le seguenti 4 coppie

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

Le rispettive probabilità di queste coppie sono

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

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

RandomChoice[<data>, 21] produce 21 tiri dei due dadi.


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

Legge la scelta dell'utente da stdin.


Alcuni consigli: for(c=51-getchar(p=0);, printf("%ser wins), espressione di riordino in rper cominciare (e risparmiare spazio.
Ugoren,

E altro ancora: (c+1)%3-> -~c%3, imposta pstatico (inizializzato su 0), rimuovi {}dopo for( ;-> ,al loro interno), usa p<11?:due volte all'interno printfinvece di assegnare p,q.
Ugoren,

E puoi impostare s,qil ciclo printfe aumentare psuccessivamente, risparmiando così le parentesi. Cambia anche il ccompito da usare %3o %7, dando un diverso ordine di 0,1,2.
Ugoren,

1

Fattore

Con include: 388

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

Sì, Factor non è proprio la lingua da usare quando si gioca a golf, ma è bello.


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")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.