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

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 .


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]

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

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]

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.


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


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

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.


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


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.


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

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

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]

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

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]

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;

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

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

3

Golfscript 80 65

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

Le programme peut être testé ici


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.


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

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

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

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

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

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-----";

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 % 

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

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.


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. *


Le nombre d'octets semble être respectivement de 105 et 100.
12Me21

Ah, j'ai dû expliquer les nouvelles lignes.
Dan Lugg
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.