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.