Lancez un dé ASCII

16

Dans ce défi de , vous devez produire un art ascii d'un jet de dé aléatoire.

comme ça:

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

Veuillez noter que:

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

est une sortie non valide, car ce n'est pas un résultat possible sur un dé

Il y a 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 possibilités de jets de dé.

Votre programme doit sortir l'un de ces jets de dé sous la forme d'un art ascii (modélisé comme celui ci-dessous, avec les xy et zs remplacés par des nombres) comme ci-dessus, chaque sortie ayant> 0 probabilité de se produire, mais les probabilités ne le font pas doivent être égaux (ils sont autorisés à être des dés pièges, contrairement à la vie réelle). Votre programme ne peut pas sortir un jet de dé invalide ou un jet de dé non. Votre programme doit avoir une probabilité de 1 de sortir un rouleau valide

Veuillez noter que votre dé ne doit pas nécessairement être un dé droitier comme indiqué sur la première image. (droitiers et gauchers décrivent le filet du dé)

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 votre dé est gaucher, ce qui suit est une sortie valide, mais pas si votre dé est droitier:

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

Bien que vous puissiez choisir gaucher ou droitier, votre dé doit être cohérent: il ne peut pas changer de gauche à droite ou vice versa

ce qui suit est une liste de sorties valides pour le dé. Référez-vous aux images ci-dessus pour les positions 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

encore une fois, c'est le , donc moins d'octets est mieux

Citron destructible
la source
4
Les solveurs pourraient être intéressés par une formule pour la troisième face du dé étant donné les deux autres.
xnor
@xnor et en tant que tel, je pense que c'est un argument fort que cette question est un doublon
Digital Trauma
1
Je ne connais cependant aucun art ASCII pour dessiner un cube dans cette projection. Avec la petite taille, je ne sais pas si l'on peut faire mieux que le codage en dur dans des langages comme Python.
xnor
@xnor en effet, même avec quelques séquences de 7 et 8 caractères.
Jonathan Allan

Réponses:

8

Python 3, 197 196 192 octets

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

Testez-le sur ideone

Droitier (passer à un gaucher en échangeant u*uavec l*lsur la dernière ligne)

Bound to be beat - mais passons les dés à soupirer - d'autant plus que toutes mes tentatives pour jouer au golf ASCII, sauf aller brut et utiliser un formatage old-school, n'ont pas réussi à économiser des octets;
- d'autres conseils de golf pour un n00b volontiers appréciés.

Jonathan Allan
la source
1
Vous pouvez enregistrer 1 octet en utilisant from random import*et c=choice.
acrolith
@daHugLenny - je ne pouvais pas maintenant manquer cet espace blanc avant le *; ta!
Jonathan Allan
1
Bienvenue chez PPCG! Bon premier post!
GamrCorps
Merci @GamrCorps - J'avais l'intention d'en faire pendant un certain temps ... maintenant j'ai un représentant, je peux poster une solution significative sur une question protégée ...: D
Jonathan Allan
2
Au lieu d'avoir 3 espaces et ensuite %d, utilisez %4dplutôt et cela le remplira correctement pour vous. Vous pourrez peut-être également l'utiliser pour d'autres parties du dé.
Value Ink
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 programme de test

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

Explication

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
la source
5

Javascript 238 232 207 201 octets

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])

qui, quand il n'est pas golfé, est:

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]
)

Algorithme

Considérez qu'à chacune des 8 intersections d'angle d'un dé, les valeurs de face de dé qui se croisent sont fixes mais peuvent apparaître dans l'une des 3 rotations. Par exemple, tout en regardant le coin "1", "2", "3", le dé peut être tourné autour d'un axe à travers le coin et à l'extérieur du coin opposé, pour afficher "1", "2" ou "3" en plus de l'art ASCII.

vcode en dur les faces de la matrice qui se croisent à chaque coin, best un décalage par rapport au début d'un coin aléatoire et oest le début de la rotation dans les données de coin. L'art ASCII est écrit sur la console à l'aide d'une console.logchaîne de format.

traktor53
la source
Vous pouvez probablement raser quelques octets en utilisant des `guillemets qui permettent d'utiliser des caractères de nouvelle ligne littéraux au lieu d'avoir à écrire \ntout le temps.
Neil
@Neil très apprécié, cela a bien fonctionné. Aussi retiré le trailing';'
traktor53
4

TSQL 308 octets

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 octets (dans Server Management Studio: requête - résultat en texte)

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

Remarque: en supprimant l'impression et la partie de déclaration - et la sortie du résultat directement à partir du SELECT. Mais ça ne marcherait pas au violon

Violon

t-clausen.dk
la source
Vous pouvez peut-être changer ABS(a^3*b-a*b^3)pour enregistrer 4 octets? (Je ne suis pas sûr - semble fonctionner dans le violon, mais il ne me donne qu'un seul rouleau de a, b, c = 5,1,3 donc je peux me tromper)
Jonathan Allan
@JonathanAllan merci pour votre commentaire. L'exponentielle est écrite POWER (a, 3) en TSQL. ^ a une signification différente
t-clausen.dk
4

Javascript, 251 octets

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

Appeler en utilisant u();
C'est long mais c'est une réponse, et je n'ai pas répondu depuis longtemps.

Chauve Bantha
la source
Manque un espace en haut à gauche du test de sortie sur ideone .
Jonathan Allan
a=()=>(0|Math.random()*6)+1;devrait sauver 8
traktor53
3

Rubis, 150 octets

Tous les abus de formatage de chaînes !!!

Le crédit pour la formule obtenant le dernier nombre va à @xnor ici .

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]
Encre de valeur
la source
Non - le crédit pour la formule revient à xnor
Jonathan Allan
@JonathanAllan merci de m'avoir indiqué le bon crédit. Quoi qu'il en soit, la façon dont j'ai formaté cette réponse correspondait davantage à ce que j'avais en tête lorsque j'ai dit que vous pouviez probablement tirer davantage parti du formatage des chaînes à votre avantage pour économiser des octets.
Value Ink