Tira un dado ASCII

16

En este desafío de , debe generar un ascii-art de una tirada de dado al azar.

Me gusta esto:

   ________
  /\       \
 /  \   6   \
{ 4  }-------}
 \  /   5   /
  \/_______/

Tenga en cuenta que:

   ________
  /\       \
 /  \   3   \
{ 4  }-------}
 \  /   5   /
  \/_______/

es una salida no válida, porque ese no es un resultado posible en un dado

Hay 6(faces that could be up)*4(faces that could be the left face after the top is determined)*1(faces that could be the right face after the other two are determined)= 24 posibilidades de tiradas de dado.

Su programa debe generar una de estas tiradas de dados en forma de arte ascii (modelado como el siguiente, con las xy y zs reemplazadas por números) como arriba, con cada salida teniendo> 0 probabilidad de ocurrir, pero las probabilidades no tienen que ser pares (se les permite ser dados trucos, a diferencia de la vida real). Su programa no puede generar una tirada de dado no válida o una tirada que no sea de dado. Su programa debe tener una probabilidad de 1 de generar una tirada válida

Tenga en cuenta que su dado no necesariamente tiene que ser un dado diestro como se muestra en la primera imagen. (diestros y zurdos describen la red del dado)

right-handed die
   ________
  /\       \    net
 /  \   z   \     _|4|_ _
{ x  }-------}   |6|2|1|5|
 \  /   y   /      |3|
  \/_______/


left handed die
   ________
  /\       \    net
 /  \   y   \     _|3|_ _
{ x  }-------}   |6|2|1|5|
 \  /   z   /      |4|
  \/_______/

Si su dado es zurdo, lo siguiente es una salida válida, pero no si su dado es diestro:

   ________
  /\       \
 /  \   2   \
{ 1  }-------}
 \  /   3   /
  \/_______/

Si bien puede elegir zurdos o diestros, su dado debe ser consistente: no puede cambiar de izquierda a derecha o viceversa

La siguiente es una lista de salidas válidas para el dado. Consulte las imágenes de arriba para ver las posiciones de XYZ:

X-Y-Z
-----
5-4-1
1-5-4
4-1-5

5-6-4
4-5-6
6-4-5

5-3-6
6-5-3
3-6-5

5-1-3
3-5-1
1-3-5

2-6-3
3-2-6
6-3-2

2-4-6
6-2-4
4-6-2

2-1-4
4-2-1
1-4-2

2-3-1
1-2-3
3-1-2

de nuevo, esto es , por lo que menos bytes es mejor

Limón Destructible
fuente
44
Los solucionadores podrían estar interesados ​​en una fórmula para la tercera cara del dado dados los otros dos.
xnor
@xnor y, como tal, creo que es un fuerte argumento de que esta pregunta es un duplicado
Digital Trauma
1
Sin embargo, no sé de ningún arte ASCII para dibujar un cubo en esta proyección. Sin embargo, con el tamaño pequeño, no sé si uno puede hacerlo mejor que la codificación en lenguajes como Python.
xnor
@xnor de hecho, incluso con algunas secuencias de caracteres 7 y 8 allí.
Jonathan Allan

Respuestas:

8

Python 3, 197196192 bytes

from random import*;c=choice;r=range(1,7);u=c(r);l=c(list(set(r)-{u,u^7}));print(r'''   ________
  /\       \
 /  \%4d   \
{ %d  }-------}
 \  /%4d   /
  \/_______/'''%(u,l,3*u*l*(u*u-l*l)%7))

Pruébalo en ideone

Derecha (cambie a zurdo intercambiando u*ucon l*len la última línea)

Obligado a ser derrotado, pero dejemos que los dados salgan a la luz , especialmente porque todos mis intentos de jugar al golf ASCII, excepto ir sin procesar y usar el formato de la vieja escuela, no pudieron guardar bytes;
- Cualquier otro consejo de golf para un n00b gustosamente apreciado.

Jonathan Allan
fuente
1
Puede guardar 1 byte usando from random import*y c=choice.
acrolith el
@daHugLenny: ahora no podía perder ese espacio en blanco antes del *; ¡ejército de reserva!
Jonathan Allan
1
Bienvenido a PPCG! Bonito primer post!
GamrCorps
Gracias @GamrCorps - He tenido la intención de hacer algo por un tiempo ... ahora tengo representante, puedo publicar una solución significativa en una pregunta protegida ...: D
Jonathan Allan
2
En lugar de tener 3 espacios y luego %d, use %4den su lugar y lo rellenará adecuadamente para usted. Es posible que también puedas aprovecharlo para otras partes del dado.
Value Ink el
5

C, 177

f(r){r=rand()%24;r=(5545>>r%4*3&63^256-(r*2&8))*513>>r/8*3;printf("   ________\n  /\\%9s /  \\%4d   \\\n{ %d  }-------}\n \\  /%4d   /\n  \\/_______/","\\\n",7&r,7&r/8,7&r/64);}

En programa de prueba

f(r){r=rand()%24;
r=(5545>>r%4*3&63^256-(r*2&8))*513>>r/8*3;
printf("   ________\n  /\\%9s /  \\%4d   \\\n{ %d  }-------}\n \\  /%4d   /\n  \\/_______/","\\\n",7&r,7&r/8,7&r/64);}

j;
main(){
    for(j=99;j--;puts(""))f();
}

Explicación

r=                    \\after calculation, assign to r (in order to use only one variable.)
(5545>>r%4*3&63       \\5545 is 12651 in octal. Select 2 digts for the equator
^256-(r*2&8))         \\if 4's bit of r is 0, prepend 4=256/64. Else prepend 3 and reverse one of the faces by xoring with 7. 256-8 = 248 = 3*64+7*8.
*513                  \\now we have a 3 digit octal number. duplicate all digits by multiplying by 1001 octal.
>>r/8*3               \\rightshift 0,1 or 2 digits to rotate. 
Level River St
fuente
5

Javascript 238 232 207 201 bytes

var r=24*Math.random()|0,o=r%3,b=r-o,v="123513653263154214624564";console.log(`   ________
  /\\       \\
 /  \\   %s   \\
{ %s  }-------}
 \\  /   %s   /
  \\/_______/`,v[r],v[b+(o+1)%3],v[b+(o+2)%3])

que cuando no tiene golf es:

var r = 24 * Math.random() | 0,
    o = r % 3,
    b = r - o,
    v = "123513653263154214624564";
console.log(
`   ________
  /\\       \\
 /  \\   %s   \\
{ %s  }-------}
 \\  /   %s   /
  \\/_______/`,

    v[r],
    v[b+(o+1)%3]
    ,v[b+(o+2)%3]
)

Algoritmo

Tenga en cuenta que en cada una de las 8 intersecciones de esquina de un dado, los valores de la cara del dado de intersección son fijos, pero pueden aparecer en cualquiera de las 3 rotaciones. Por ejemplo, mientras mira hacia abajo en la esquina "1", "2", "3", el dado se puede girar alrededor de un eje a través de la esquina y fuera de la esquina opuesta, para mostrar "1", "2" o "3" además del art. ASCII

vcodifica las caras del troquel que se cruzan en cada esquina, bes un desplazamiento al comienzo de una esquina aleatoria y oes el comienzo de la rotación dentro de los datos de la esquina. El arte ASCII se escribe en la consola usando una console.logcadena de formato.

traktor53
fuente
Probablemente pueda reducir algunos bytes usando `comillas que permitan el uso de caracteres de nueva línea literales en lugar de tener que escribir \ntodo el tiempo.
Neil
@Neil más apreciado, funcionó bien. También se eliminó el final';'
traktor53
4

TSQL 308 bytes

DECLARE @ char(87)=(SELECT
REPLACE(REPLACE(REPLACE('   ________
  /\       \ 
 /  \   7   \ 
{ 8  }-------}
 \  /   9   /
  \/_______/',7,a),8,b),9,3*ABS(a*a*a*b-a*b*b*b)%7)
FROM(SELECT*,SUBSTRING(REPLACE(STUFF(123456,a,1,''),7-a,''),CAST(RAND()*4as int)+1,1)b
FROM(SELECT CAST(RAND()*6as int)+1a)x)x)PRINT @

280 bytes (en Server Management Studio: Consulta - resultado en texto)

SELECT
REPLACE(REPLACE(REPLACE('   ________
  /\       \ 
 /  \   7   \ 
{ 8  }-------}
 \  /   9   /
  \/_______/',7,a),8,b),9,3*ABS(a*a*a*b-a*b*b*b)%7)
FROM(SELECT*,SUBSTRING(REPLACE(STUFF(123456,a,1,''),7-a,''),CAST(RAND()*4as int)+1,1)b
FROM(SELECT CAST(RAND()*6as int)+1a)x)x

Nota: al eliminar la impresión y la parte de declaración, y generar el resultado directamente desde SELECT. Sin embargo, eso no funcionaría en el violín

Violín

t-clausen.dk
fuente
¿Quizás puede cambiar a ABS(a^3*b-a*b^3)para guardar 4 bytes? (No estoy seguro, parece funcionar en el violín, pero solo me da una sola tirada de a, b, c = 5,1,3, así que puedo estar equivocado)
Jonathan Allan el
@ JonathanAllan gracias por tu comentario. Exponencial se escribe POTENCIA (a, 3) en TSQL. ^ tiene un significado diferente
t-clausen.dk
4

Javascript, 251 bytes

r="replace";a=()=>(0|Math.random()*6)+1;b=(x,y)=>3*x*y*(x*x+6*y*y)%7;u=()=>{x=a(),y=a();z=b(x,y);if(z==0)u();return"   ________\r\n  \/\\       \\\r\n \/  \\   1   \\\r\n{ 2  }-------}\r\n \\  \/   3   \/\r\n  \\\/_______\/"[r](1,x)[r](2,y)[r](3,z);}

Llamar usando u();
Es largo pero es una respuesta, y no he respondido en mucho tiempo.

Bantha calvo
fuente
Falta un espacio en la parte superior izquierda de la prueba de salida en ideone .
Jonathan Allan
a=()=>(0|Math.random()*6)+1;debería ahorrar 8
traktor53
3

Ruby, 150 bytes

Todo el abuso de formato de cadena !!!

El crédito por la fórmula para obtener el último número va a @xnor aquí .

u=1+rand(6)
l=([*1..6]-[u,u^7]).sample
$><<'%11s
  /\%8s
 /  \%4d%4s
{ %d  }%s}
 \  /%4d%4s
  \/%s/'%[?_*8,?\\,u,?\\,l,?-*7,3*u*l*(u*u-l*l)%7,?/,?_*7]
Tinta de valor
fuente
No - el crédito por la fórmula va para xnor
Jonathan Allan
@ JonathanAllan gracias por señalarme hacia el crédito adecuado. En cualquier caso, la forma en que formateé esta respuesta fue más de lo que tenía en mente cuando dije que probablemente podría aprovechar el formato de cadena más a su favor para ahorrar bytes.
Value Ink el