Dessiner les résultats des dés en ASCII

25

Affiche le résultat aléatoire d'un lancer de dés s'il est effectué avec un dé en forme de cube, en ASCII.

$ dice

devrait se traduire par l'un des

-----
|   |
| o |
|   |
-----

-----
|o  |
|   |
|  o|
-----

-----
|o  |
| o |
|  o|
-----

-----
|o o|
|   |
|o o|
-----

-----
|o o|
| o |
|o o|
-----

-----
|o o|
|o o|
|o o|
-----
Jonas Elfström
la source
4
Vous n'avez pas défini la métrique ici. S'agit-il d'un golf à code? Il vaut toujours la peine de discuter des tâches possibles dans le chat du laboratoire de puzzle ou le bac à sable sur la méta afin que vous puissiez répondre à ce genre de questions avant de passer en direct.
dmckee
Désolé, je pensais que la métrique est toujours le nombre de caractères? Merci de m'avoir pointé vers le chat puis le bac à sable sur meta Si cette question tombe à plat, je la supprimerai. Je déteste le faire maintenant, juste au cas où quelqu'un aurait déjà commencé à travailler dessus.
Jonas Elfström
Ah ... notez le nom du site "Programmation des puzzles et du golf de code" (et oui, je pensais que ça scannait mieux dans l'autre sens aussi). Vous y trouverez également des one-liners , des tournois king-of-the-hill et des défis de code (tout le reste, mais vous êtes toujours censé établir une métrique objective pour gagner), il est donc nécessaire de dire et d'appliquer la bonne étiquette.
dmckee
13
Selon XKCD # 221 , alert('-----\n|o o|\n| |\n|o o|\n-----');c'est un programme correct.
JiminP
9
Si vous supprimez la balise ascii-art, je peux offrir ma solution 39char print("⚀⚁⚂⚃⚄⚅"(util.Random.nextInt(6)))(utf-art).
utilisateur inconnu

Réponses:

7

Golfscript, 56 caractères

"-"5*n"|":|"o "1/:&6rand:§1<=" "&§3<=|n|&§5<=]&§2%=1$-1%

La solution peut être testée ici .

Ventero
la source
25

Python, 112110 caractères

from random import*
r=randrange(6)
C='o '
s='-----\n|'+C[r<1]+' '+C[r<3]+'|\n|'+C[r<5]
print s+C[r&1]+s[::-1]
Keith Randall
la source
6
Ces comparaisons dans l'indexeur de tableaux sont totalement impressionnantes!
Jonas Elfström
2
Idem! J'aime aussi la façon dont vous avez utilisé la symétrie du dé :)
System Down
Pourriez-vous utiliser quelque chose comme id(0)%7%6? Ce ne sera pas une distribution uniforme, mais c'est beaucoup plus court ...
Nabb
@Nabb: ce n'est pas très aléatoire. En particulier, il est souvent le même d'un cycle à l'autre, il ne serait donc pas très utile de générer des lancers de dés aléatoires.
Keith Randall
11

Ruby 1.9, 80 84 caractères

z=" o";$><<(s=?-*5+"
|#{z[2/~a=rand(6)]} #{z[a/3]}|
|"+z[a/5])+z[~a%2]+s.reverse
Ventero
la source
J'ai aimé le +s.reverse
Jonas Elfström
7

Windows PowerShell, 89 93 96 97 101 119 caractères

-join('-----
|{0} {1}|
|{2}{3}'-f'o '[$(!($x=random 6);$x-lt3;$x-ne5;$x%2)])[0..14+13..0]
Joey
la source
5

Python, 109 caractères unicode

#coding:u8
print u"鱸헓ȅ᪮ԅ᪅餠☏汁끝鐸즪聗K糉툜㣹뫡燳闣≆뤀⩚".encode("u16")[2:].decode("zlib").split("\n\n")[id(list())%7-1]

Remarque: Cela n'utilise pas la fonction aléatoire, donc ce ne sera pas aussi aléatoire que les autres.

TOI
la source
5

Perl, 74 caractères

Courez avec perl -M5.010.

$-=rand 6;$_="-----
|0 2|
|4";s/\d/$->$&?o:$"/ge;say$_,$-&1?$":o,~~reverse

(Notez que les sauts de ligne dans la liste font partie de la chaîne et ne sont pas simplement insérés pour la lisibilité.)

Si vous vous demandez à quoi $->$sert l' opération, les notes de lecture suivantes peuvent être utiles:

  • La variable $-tronque automatiquement sa valeur affectée à un entier.

  • La variable $"est prédéfinie sur un seul espace.

  • oest un mot simple (représentant "o").

boite à pain
la source
4

Golfeur pour la première fois

Python, 161 caractères

from random import*
n=randint(1,7)    
o,x='o '
a='-'*5
b=(x,o)[n>3]
d=(x,o)[n>5]
c=(x,o)[n>1]    
print a+'\n|'+c+x+b+'|\n|'+d+(x,o)[n%2]+d+'|\n|'+b+x+c+'|\n'+a
Système hors service
la source
4

Common Lisp 170

(let*((r(random 6))(a "-----
|")(c "o")(d " ")(e "|
|")(f(concatenate 'string a(if(< r 1)d c)d(if(< r 3)d c)e(if(> r 4)c ))))(concatenate 'string f(if(evenp r)c d)(reverse f)))

Notez que les nouvelles lignes sont importantes. Contrairement à ces langages idiots "modernes", Common Lisp privilégie la lisibilité à la concision, nous avons donc la lourde construction "concaténer" la chaîne ... "et aucun moyen succinct de référencer un caractère dans une chaîne.

Dr. Pain
la source
4

JavaScript ( 169 168 141 137)

r=Math.random()*6|0;s='-----\n|'+(r>0?'o ':'  ')+(r>2?'o':' ')+'|\n|'+(r-5?' ':'o');alert(s+(r%2?' ':'o')+s.split('').reverse().join(''))

Ne semble pas tout à fait correct alertcar ce n'est pas une police à largeur fixe, mais soyez assuré qu'elle est correcte, ou testez en émettant une <pre>balise et en faisant writeln:-)

Preuve: http://jsfiddle.net/d4YTn/3/ (ne fonctionne que dans les navigateurs compatibles JS 1.7, tels que FF2 +)

Crédits: MathAstuce piratée de @minitech et logique d'impression de @Keith.

Edit : Supprimez l' Mathastuce de @minitech car cela l'a en fait allongé :-)

Édition 2 : enregistrez 17 caractères. Empruntez une astuce à @Keith pour profiter de la symétrie des dés. Utilisez une astuce pour simplifier la conversion d'un nombre aléatoire en entier.

Edit 3 : Supprimer 1+pour déplacer le nombre aléatoire de 1-6 à 0-5 et enregistrer 2 caractères. Par conséquent, je peux aussi changer r%2-1pour r%2et enregistrer 2 autres caractères.

Edit 4 : jsfiddle fonctionne à nouveau. Mis à jour :-)

mellamokb
la source
E4X! Et je ne peux pas croire que Chrome ne le supporte pas!
Ry-
Hé, je vous ai enfin battu :)
Ry-
Deux personnages, maintenant, utilisant votre |0astuce :-)
Ry-
Cela fonctionne dans Chrome pour moi.
pimvdb
4

JavaScript, 215 213 212 145 135

r=Math.random()*6|0;alert('-----\n|'+[r>2?'o o':r?'o  ':'   ',r%2?r>3?'o o':'   ':' o ',r>2?'o o':r?'  o':'   '].join('|\n|')+'|\n-----');

Battre mellamokb, mais j'ai complètement changé ma solution d'origine. Si vous voulez que cela paraisse bien, utilisez Google Chrome ou quelque chose, changez alertpour console.log, et voilà.

Edit: emprunté à l'astuce | 0 de mellamokb pour sauver certains personnages.

Ry-
la source
@minitech: BTW, votre M=Mathastuce que j'ai essayé de voler finit par être un personnage de plus
mellamokb
@mellamokb: Je sais, je pensais à l'origine que je l'utiliserais plus ...
Ry-
@minitech: Vous pouvez enregistrer deux caractères avec[s.substr(0,3),s.substr(3,3),s.substr(6,3)].join('|\n|')
mellamokb
1
@mellamokb: Non; sest un tableau. Je vais redémarrer et réessayer.
Ry-
@minitech: C'est reparti :-) Evolution de la meilleure réponse par compétition. Maintenant, je suis à 137, mais vous pouvez emprunter l'un de mes trucs et enregistrer éventuellement 10 caractères.
mellamokb
3

PHP 119 126 128 131 188 201 201 213 234 239

<?$c=($r=rand()%6)%2?$r>4?'o ':'  ':' o';$b=$r>0?$r<3?'o  ':'o o':'   ';echo$a="-----\n|$b|\n|$c",substr(strrev($a),1);
Oleg
la source
La fermeture ?>peut être omise, vous économisant 2 caractères.
Ry-
Vous pouvez incorporer la déclaration pour $r, en enregistrant un autre caractère. L'espace après echopeut également être omis. Vous pouvez $aégalement aligner l'initialisation de , ce qui vous amène à 128. Mettre des sauts de ligne directement dans la chaîne au lieu de les échapper avec \nenregistre deux autres caractères.
Joey
3

C - 215

#include <time.h>
#include <stdlib.h>
main(){char a[]=A,b[]=B,c=3,d=(srand(time(0)),rand()%6+1),e=d-2;if(d==1)a[5]=C;else{while(--e>-1)a[b[D[d-3]-48+e]-48]=C;a[0]=a[10]=C;}p(E);while(--c>-1)p("|%s|\n",a+c*4);p(E);}

Compile avec:

cl /DA="\"   \0   \0   \"" /DB="\"5282582468\"" /DC='o' /DD="\"0136\"" /DE="\"+---+\n\"" /Dp=printf dice.c
user23241
la source
1
Est-ce que ça triche avec tous ces drapeaux sur la ligne de commande? Je ne comprends pas la chose / DA / DB / DC ...
mellamokb
Mon compilateur ne comprend pas le /Dcommutateur ... Veuillez ne pas tricher en mettant des définitions aléatoires dans la commande de compilation.
FUZxxl
3

Python 133

import random as R
i=R.randint(1,6)
a='   ';b='0 0'
A='-----\n|'+((a,'0  ')[i>1],b)[i>3]+'|\n|'
print A+((a,' 0 ')[i%2],b)[i>5]+A[::-1]
0b1t
la source
3

F # - 165 161 caractères

(System.Random()).Next 6|>fun x->[for y in[x>0;x%2=0;x>2;x=5]->if y then"o"else" "]|>fun[a;b;c;d]->printf"-----\n|%s %s|\n|%s%s%s|\n|%s %s|\n-----"a c d b d c a
nharren
la source
3

Python 108 114 119 121 122 129

wtf! ressemble à la 1ère solution?! mais je ne suis pas ... tricheur

108

import random as R
i=R.randint(1,6)
X=' 0'
A='-----\n|%s %s|\n|'%(X[i>1],X[i>3])+X[i>5]
print A+X[i%2]+A[::-1]

119

import random as R
i=R.randint(1,6)
X=' 0';a=X[i>5]
A='-----\n|%s %s|\n|%s|'%(X[i>1],X[i>3],a+X[i%2]+a)
print A+A[-6::-1]
0b1t
la source
3

perl - 111 103 101

$n=int rand 6;
($t="-----\n|0 1|\n|232|\n|1 0|\n-----\n")=~s/(\d)/5639742>>6*$1>>$n&1?o:$"/eg;
die$t;
swilliams
la source
1
+1 pour l'utilisation dieau lieu de print/say
mbx
3

APL (69)

5 5⍴(5⍴'-'),{⊃⍵↓' o|'}¨2,(⌽M),2,2,(N∊¨6(1 3 5)6),2,2,2,⍨M←3 6 1>⍨N←?6
marinus
la source
3

Haskell, 154 162 167 172 caractères

import System.Random
main=randomRIO(1::Int,6)>>=putStrLn. \x->let{h="-----\n|"++c(>1):' ':c(>3):"|\n|"++[c(>5)];c f|f x='o'|True=' '}in h++c odd:reverse h

Il utilise à peu près la même idée que celle de Python.

Version lisible:

import System.Random

main = do
    x <- randomRIO (1 :: Int, 6)
    putStrLn (render x)

render x = str ++ check odd ++ reverse str
  where
    str = concat
        [ "-----\n|"
        , check (> 1)
        , " "
        , check (> 3)
        , "|\n|"
        , check (> 5)
        ]
    check f = if f x then "o" else " "
Fée lambda
la source
3

Golfscript 80 65

6rand):^;'-'5*n+:_[^6&0^4&^6=].^1&+-1%+3/{'|'\{'o'' 'if+}/'|'n}/_

Le programme peut être testé ici

Cristian Lupascu
la source
2

PHP 126 127 179

<?$x=($r=rand(1,6))>3?"o o":($r<2?"   ":"o  ");$z=$r>5?"o o":($r%2==0?"   ":" o ");$v="-----\n|$x|\n";echo"$v|$z|".strrev($v);

Une autre solution PHP. Je suis arrivé à la même solution par Oleg.

Alberto Fernández
la source
2

Python (153)

Ce n'est de loin pas la plus petite soumission, je pensais juste que c'était joli :)

import random as r
print"""-----
|%c %c|
|%c%c%c|
|%c %c|
-----"""%tuple(
r.choice([
"   o   ",
"o     o",
"o  o  o",
"oo   oo",
"oo o oo",
"ooo ooo"]))
quasimodo
la source
2

Q (120 caractères)

dice:{(`t`e`l`c`r`w!5 cut"-----|   ||o  || o ||  o||o o|")(,/)(`t;(`e`c`e;`l`e`r;`l`c`r;`w`e`w;`w`c`w;`w`w`w)(*)1?6;`t)}

Usage:

dice[]
skeevey
la source
2

C, 168 164 163 caractères

Désolé si je suis un peu en retard à la fête, mais comme aucune réponse n'a encore été acceptée et que la seule autre solution C était un peu plus longue, voici ...

#include<stdio.h>
main(){srand(time(0));char*o="O ",r=rand()%6,i=o[r<1],j=o[r<3],k=o[r<5];printf("-----\n|%c %c|\n|%c%c%c|\n|%c %c|\n-----\n",i,j,k,o[r&1],k,j,i);}

Vous pouvez supprimer l'inclusion et enregistrer 18 autres caractères, mais il ne se compile pas sans avertissements.

Edit : en
utilisant l' astuce de ligne de commande de user23241 , le code C le plus court qui produit le résultat (sans avertissements du compilateur) n'est que de 12 caractères:

#include I
M

Au moins si vous trichez et utilisez la ligne de commande suivante pour compiler:

gcc -DI="<stdio.h>" -DM="main(){srand(time(0));char*o=\"O \",r=rand()%6,i=o[r<1],j=o[r<3],k=o[r<5];printf(\"-----\n|%c %c|\n|%c%c%c|\n|%c %c|\n-----\n\",i,j,k,o[r&1],k,j,i);}" dice.c -o dice
Mr Lister
la source
2

c, 140 caractères

r,i,s;main(){srand(time(i=0));r=rand()%6;for(s=-1;i-=s;)putchar("\n|   |-o"[i>5?i==8&&r||i==10&&2<r||i==14&&4<r||i==15&&(s=1)&~r?7:i%6:6]);}
bébé-lapin
la source
1

PHP: 1284

C'est mon deuxième CodeGolf, et je ne visais pas autant la brièveté que la mutabilité du code et les critères de jeu.

Vous pouvez générer des dés à 4 faces et 6 faces.

Peut-être plus tard, je vais le raccourcir et le rendre un peu plus dynamique.

function draw_dice($numdice=1,$sides=4)
{
/* Verify acceptable parameters. */
if($sides<4){die("You must choose 4 sides or greater.");}
if($numdice<1){die("You must have at least one dice.");}
/* End verification */
$a=' ';
$b=' ';
$c=' ';
$d=' ';
$e=' ';
$f=' ';
$g=' ';
$h=' ';
$i=' ';
$j=' ';

switch($sides)
{
case $sides%2==0:
if($sides==4)
{
$ran=rand(1,$sides);
switch($ran)
{
case 1:
$e="o";
break;
case 2:
$a="o";
$j="o";
break;
case 3:
$b="o";
$g="o";
$j="o";
break;
case 4:
$a="o";
$c="o";
$g="o";
$j="o";
break;
}
echo "<div style='text-align:center;display:inline-block;'>";
echo " - <br/>";
echo "| |<br/>";
echo "|$a$b$c|<br/>";
echo "| $d$e$f |<br/>";
echo "|  $g$h$i$j  |<br/>";
echo "---------<br/>";
echo "</div>";

}

if($sides==6)
{
$ran=rand(1,$sides);
switch($ran)
{
case 1:
$e="o";
break;
case 2:
$a="o";
$i="o";
break;
case 3:
$a="o";
$i="o";
$e="o";
break;
case 4:
$a="o";
$c="o";
$g="o";
$i="o";
break;
case 5:
$a="o";
$c="o";
$g="o";
$i="o";
$e="o";
break;
case 6:
$a="o";
$c="o";
$d="o";
$f="o";
$g="o";
$i="o";
break;
}
echo "-----<br/>";
echo "|$a$b$c|<br/>";
echo "|$d$e$f|<br/>";
echo "|$g$h$i|<br/>";
echo "-----<br/>";
}

if($sides!==4&&$sides!==6)
{
die("Only 4 and 6 sided are supported at this time.");
}

break;

case $sides%2==1:
die("Must have even number of sides.");
break;
}

}

draw_dice(1,4);

Sortie 4 faces:

    - 
   | |
  |o o|
 |     |
|  o  o  |
---------

Sortie 6 faces:

-----
|o  |
| o |
|  o|
-----
Event_Horizon
la source
1

JavaScript 220 octets

r=(1+Math.random()*6|0).toString(2).split("").reverse();b=r[1];c=r[2];s=[[b|c,0,c],[b&c,1&r[0],b&c],[c,0,b|c]];"-----\n|"+s.map(function(v){return v.map(function(w){return w?"o":" "}).join("")}).join("|\n|")+"|\n-----";
eikes
la source
1

Ruby, 134 132 119 118 117 117 112 111 car,

Mon deuxième golf dans la vie. J'ai utilisé des nombres magiques. Des conseils s'il vous plaît?

r=?-*5+"
|"+((a=:ghklm[rand 6])?a.to_i(36).to_s(2).tr("10","o "):"    o").insert(3,"|
|")
$><<r+r[0,14].reverse

Les sorties:

ice@distantstar ~/virt % ruby ./golf.rb
-----
|o o|
|   |
|o o|
-----
ice@distantstar ~/virt % ruby ./golf.rb
-----
|o o|
|o o|
|o o|
-----
ice@distantstar ~/virt % ruby ./golf.rb
-----
|   |
| o |
|   |
-----
ice@distantstar ~/virt % 
defhlt
la source
1

VimScript - 169 caractères

Notez qu'il ne s'agit pas de Vim pur car Vim n'a pas de générateur de nombres aléatoires intégré. Il existe bien sûr des extensions qui peuvent être téléchargées, mais comme je suis un homme Linux inconditionnel, j'ai pensé, pourquoi ne pas simplement compter sur l'environnement shell à la place.

Code

norm5a-^[YPo|   |^[YPP
let x=system('echo $RANDOM')%6+1
if x<2
norm jllro
el
norm lrolljj.k
if x>3
norm k.hjj
en
if x>2
norm h.k
en
if x>5
norm .l
en
if x>4
norm l.
en
en

Explication

  • La première ligne génère la "boîte" qui représente le dé.
  • La deuxième ligne récupère un nombre aléatoire de l'environnement et l'utilisation de l'arithmétique modulaire le force à être un nombre valide pour un dé.
  • Les lignes restantes se déplacent autour de la face du dé en remplissant le o. Notez que cela est censé être optimisé pour le moins de caractères, pas le moins de mouvements (c'est-à-dire qu'il y aurait des façons plus rapides de tourner les frappes si je le faisais manuellement - en faisant le ifs tout dans ma tête).
  • Comme toujours, ce ^n'est pas un littéral ^mais une indication d'une séquence d'échappement.

Essai

Passez RANDOMà DICEVALUE, enregistrez le code VimScript dans dice.vim, puis exécutez ce script shell dessus, en donnant comme arguments les nombres que vous souhaitez tester:

#!/bin/sh
for DICEVALUE in $@; do
    export DICEVALUE
    vim -S dice.vim
done
Kazark
la source
1

Mathematica 166 161 146 146 143 caractères

a="O  ";b=" O ";c="  O";d="   ";e="O O";RandomInteger@{1, 6}/.Thread@Rule[Range@6,{{d,b,d},{a,d,c},{a,b,c},{e,d,e},{e,b,e}, {e,e,e}}]//MatrixForm

Exemple de sortie:

cinq


Si les accolades de la matrice offensent, vous pouvez remplacer MatrixFormpar TableFormdans le code.

DavidC
la source
1

PHP 5.4, 107 octets

<?$r=rand(1,6);$d=[' ','o'];$o='+---+
|'.$d[$r>1].' '.$d[$r>3].'|
|'.$d[$r>5];echo$o.$d[$r%2].strrev($o);

102 octets *

<?$r=rand(1,6);$d=' o';$o='+---+
|'.$d[$r>1].' '.$d[$r>3].'|
|'.$d[$r>5];echo$o.$d[$r%2].strrev($o);

** Malheureusement, la version 102 octets émet des notifications en raison de la conversion de boolen intlors de l'indexation de la chaîne $d. En dehors de cela, cela fonctionne bien. *

Dan Lugg
la source
Le nombre d'octets semble être respectivement de 105 et 100.
12Me21
Ah, j'ai dû expliquer les nouvelles lignes.
Dan Lugg