Juego de dados no transitivo

10

Aquellos de ustedes que gustan de Numberphile estarían familiarizados con el Dr. James Grime, quien describió un juego de dados no transitivo en su canal .

El juego consta de tres dados de 6 caras:

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

Dos jugadores seleccionan cada uno un dado para usar. Los tiran y el dado más alto gana, lo mejor de lo que sea.

Probablemente, el dado 1 vence al dado 2 con> 50% de probabilidad. Del mismo modo, muere 2 latidos muere 3, y, curiosamente, muere 3 latidos muere 1.

Escribir un programa tomando 1, 2o 3como entrada. Esto indica el dado que elige el usuario. Luego, el programa elige el dado que vencería al usuario y generaría los resultados de 21 tiradas, y " Computer/User wins with x points"

Reglas

  • Code-golf, vota como desempate
  • Debes usar RNG (o similares) para simular realmente las tiradas de dados.
  • No soy demasiado estricto con el formato de salida. Está bien siempre y cuando muestres los dados, de alguna manera se separen entre las 21 tiradas (de una manera diferente de cómo se separan los dados en la misma tirada), y diga la oración anterior.
  • La entrada puede ser stdin, argumento de línea de comando, desde la pantalla, etc.

Ejemplo

Entrada

1

Salida

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

Aquí, el usuario elige el dado 1 y sus tiradas se muestran en la columna derecha. El programa elige morir 3 y lo vence.

TwiNight
fuente

Respuestas:

1

GolfScript, 112 105 caracteres

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

Ejecútalo en línea .

El script espera la entrada en STDIN y luego imprime el resultado de las tiradas de dados (computadora de la primera columna, segundo usuario) y las estadísticas finales en STDOUT.

Howard
fuente
4

APL ( 106 114)

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

Explicación:

  • (↓5 6⍴545170074510753⊤⍨18⍴7)[⎕+⍳2]: El gran número es una representación de base 7 de los dados. Hacemos una matriz de 6x5 que contiene los valores de los dados en el orden: 2 3 1 2 3. Solicite la entrada del usuario y agregue esto al vector 1 2, y seleccione estas líneas de la matriz. Debido a que la lista de dados se cambia, el usuario ahora obtiene el que seleccionó (a la derecha) y la computadora obtiene el más fuerte.
  • {⍵[{?6}¨⍳21]}¨: haz 21 tiradas por cada uno de estos dos dados.
  • ⎕←⍉↑: coloca los rollos en forma de matriz y los genera.
  • Z←+/>/: obtener la puntuación de la computadora (cantidad de veces que el valor de la computadora fue mayor que el del usuario)
  • X←11>Z: establece Xsi el usuario ganó (si 11 es más alto que el puntaje de la computadora).
  • 'Computer' 'User'[1+X]. Xes si el usuario ganó.
  • 'wins with','points',⍨|Z-21×X: ZEs la puntuación del equipo, por lo que si la pantalla del ordenador de won Z, de lo contrario mostrar 21-Z.
marinus
fuente
El puntaje no es la diferencia de los totales (que se espera que sea 0 para todos los pares de dados), en cambio, el ganador de cada una de las 21 tiradas obtiene 1 punto. En el ejemplo, el usuario tiene 5 puntos (de ganar 5 rollos: 4-6, 1-3, 1-3, 1-3, 4-6) y la computadora obtiene los 16 puntos restantes.
TwiNight
@TwiNight: arreglado
marinus
Puntos negativos cuando el usuario gana. Puede solucionar por |Z-21×Xqué no cambia el recuento de caracteres
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")

Ejemplo de ejecución:

> 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
fuente
Puede reemplazar summary.factorcon table, guardando 9 caracteres.
Brian Diggs
2

Mathematica 208 172 166 159

Espacios añadidos para mayor claridad.

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. belisario
fuente
Creo que se supone que la salida enumera los valores de cada lanzamiento de dados.
DavidC
@dude sí, lo perdí mientras probaba. Hice una reparación rápida solo para mantener la pelota en funcionamiento. Más adelante pensaré cómo mejorarlo.
Dr. belisario
Ahora parece estar funcionando bien.
DavidC
@dude Mucho mejor ahora
Dr. belisarius
Muy agradable. +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 obtiene el valor ascii de la entrada (solo ruby ​​1.8), que felizmente es congruente módulo 3 a su valor entero.

scomienza en 21, por lo que s.times{code}se ejecutará code21 veces y devolverá 21. En cada iteración, el ciclo suma o resta 1 de s dependiendo de quién gana, por lo que podemos ver quién ganó al ver si sha terminado por debajo de 21. Genial hasta ahora , pero luego necesito la expresión torpe [s/=2,21-s].maxpara extraer el número real de puntos. Hace mucho que quería hacer aritmética con el valor de retorno de <=>, así que estoy feliz de todos modos.

histocrat
fuente
1

Mathematica 234 247

Código

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

{Rollo del jugador, rol de la computadora}

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

resultados


Explicación

nes el número 1, 2 o 3 que corresponde al dado del jugador. Como n también determina (pero no es igual) el dado de la computadora, podemos generar todas las tiradas posibles de los dados cuando n = 1, n = 2, n = 3. También podemos determinar sus respectivas probabilidades.

Examine los datos justo después RandomChoice:

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

Si el jugador saca el dado 1, los únicos resultados posibles son los siguientes 4 pares

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

Las probabilidades respectivas de estos pares son

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

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

RandomChoice[<data>, 21] saca 21 tiradas de los dos dados.

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

Lee la elección del usuario de stdin.

dejó de girar en sentido antihorario
fuente
Algunos consejos: for(c=51-getchar(p=0);, printf("%ser wins), reordenar expresión en rque comienzan con (y ahorrar espacio.
Ugoren
Y más: (c+1)%3-> -~c%3, hacer pstatic (inicializado a 0), eliminar {}después for( ;-> ,dentro de ellos), usar p<11?:dos veces dentro en printflugar de asignar p,q.
Ugoren
Y puede establecer s,qen el bucle printf, e incrementar pdespués, guardando así los paréntesis. También cambie la casignación a usar %3o %7, dando un orden diferente de 0,1,2.
Ugoren
1

Factor

Con incluye: 388

Sin: 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 no es realmente el lenguaje a usar cuando se juega golf, pero es bueno.

Matthew Rolph
fuente
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
fuente
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
fuente