Desenhar resultados de dados em ASCII

25

Mostre o resultado aleatório de um lançamento de dados, se feito com um dado em forma de cubo, em ASCII.

$ dice

deve resultar em um

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

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

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

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

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

-----
|o o|
|o o|
|o o|
-----
Jonas Elfström
fonte
4
Você não definiu a métrica aqui. Isso significa ser um código de golfe? Sempre vale a pena discutir possíveis tarefas no chat do laboratório de quebra - cabeças ou na caixa de areia na meta, para que você possa resolver esses tipos de perguntas antes de ir ao ar.
dmckee
Desculpe, eu pensei que a métrica sempre é o número de caracteres? Obrigado por me indicar o bate-papo e depois a caixa de areia no meta. Se essa pergunta cair de cara, eu a excluirei. Eu odeio fazer isso agora, apenas no caso de alguém já começar a trabalhar nele.
Jonas Elfström
Ah ... observe o nome do site "Programação de quebra-cabeças e código de golfe" (e sim, eu pensei que ele era digitalizado melhor ao contrário também). Você também encontrará one-liners , torneios do rei da colina e desafios de código (tudo mais, mas você ainda deve estabelecer uma métrica objetiva para vencer), por isso é necessário dizer e aplicar as regras apropriadas. tag.
dmckee
13
De acordo com o XKCD # 221 , alert('-----\n|o o|\n| |\n|o o|\n-----');é um programa correto.
JiminP
9
Se você remover a tag ascii-art, posso oferecer minha solução de 39 caracteres print("⚀⚁⚂⚃⚄⚅"(util.Random.nextInt(6)))(utf-art).
usuário desconhecido

Respostas:

7

Golfscript, 56 caracteres

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

A solução pode ser testada aqui .

Ventero
fonte
25

Python, 112 110 caracteres

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
fonte
6
As comparações no indexador de array são totalmente impressionantes!
Jonas Elfström
2
Idem! Eu gosto de como você usou a simetria do dado também :) #
System Down
Você poderia usar algo parecido id(0)%7%6? Não vai ser uma distribuição uniforme, mas é significativamente mais curto ...
Nabb
@ Nabb: isso não é muito aleatório. Em particular, geralmente é o mesmo de uma corrida para outra, portanto não seria muito útil na geração de jogadas aleatórias de dados.
Keith Randall
11

Ruby 1.9, 80 84 caracteres

z=" o";$><<(s=?-*5+"
|#{z[2/~a=rand(6)]} #{z[a/3]}|
|"+z[a/5])+z[~a%2]+s.reverse
Ventero
fonte
Gostei do +s.reverse
Jonas Elfström
7

Windows PowerShell, 89 93 96 97 101 119 caracteres

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

Python, 109 caracteres unicode

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

Nota: Isso não usa a função aleatória, por isso não será tão aleatório como os outros.

VOCÊS
fonte
5

Perl, 74 caracteres

Corra com perl -M5.010.

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

(Observe que as novas linhas da lista fazem parte da sequência e não são apenas inseridas para facilitar a leitura.)

Se você se perguntar o que diabos a $->$operação faz, as seguintes notas de leitura podem ser úteis:

  • A variável $-trunca automaticamente o valor atribuído a um número inteiro.

  • A variável $"está predefinida para um único espaço.

  • oé uma palavra de barra (representando "o").

caixa de pão
fonte
4

Jogador de golfe pela primeira vez

Python, 161 caracteres

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
Sistema caiu
fonte
4

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

Observe que as novas linhas são significativas. Diferente dessas linguagens tolas e "modernas", o Common Lisp favorece a legibilidade em detrimento da sucessão, então temos a construção "concatenar 'string ..." complicada e nenhuma maneira sucinta de referenciar um caractere em uma string.

Dr. Pain
fonte
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(''))

Não parece correto alertporque não é uma fonte de largura fixa, mas tenha certeza de que está correto ou teste ao emitir uma <pre>tag e executarwriteln :-)

Prova: http://jsfiddle.net/d4YTn/3/ (funciona apenas em navegadores compatíveis com JS 1.7, como o FF2 +)

Créditos: Mathtruque hackeado da @minitech e lógica de impressão da @Keith.

Edit : Remova o Mathtruque do @minitech porque ele realmente o tornou mais longo :-)

Editar 2 : economize 17 caracteres. Peça o truque de @Keith para tirar proveito da simetria dos dados. Use o truque para simplificar a conversão de números aleatórios em int.

Editar 3 : Remover 1+para mudar o número aleatório de 1-6 para 0-5 e salvar 2 caracteres. Como resultado, eu também pode mudar r%2-1para r%2e salvar mais 2 caracteres.

Edit 4 : jsfiddle está funcionando novamente. Atualizada :-)

mellamokb
fonte
E4X! E não acredito que o Chrome não suporte!
#
Heh, eu venci você finalmente :)
Ry-
Agora, dois caracteres, usando seu |0truque :-)
Ry-
Funciona no Chrome para mim.
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-----');

Bata mellamokb, mas mudei completamente minha solução original. Se você deseja que isso pareça bom, use o Google Chrome ou algo assim, mude alertpara console.loge pronto.

Edit: o truque emprestado do mellamokb | 0 para salvar alguns personagens.

Ry-
fonte
@minitech: BTW, o seu M=Mathtruque que eu tentei roubar realmente acaba sendo um personagem mais
mellamokb
@mellamokb: Eu sei, eu pensava originalmente que iria usá-lo mais ...
Ry-
@minitech: Você pode salvar dois caracteres com[s.substr(0,3),s.substr(3,3),s.substr(6,3)].join('|\n|')
mellamokb
1
@mellamokb: Não; sé uma matriz. Vou reiniciar e tentar novamente.
#
@minitech: Aqui vamos novamente :-) Evolução da melhor resposta da concorrência. Agora estou com 137, mas você pode pegar emprestado um dos meus truques e economizar possivelmente 10 caracteres.
Mellamokb
3

PHP 119 126 128 131 188 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
fonte
O fechamento ?>pode ser omitido, economizando 2 caracteres.
Ry-
Você pode incorporar a declaração para $r, salvando outro caractere. O espaço depois também echopode ser omitido. Você também pode incorporar a inicialização $a, levando-o a 128. Colocar quebras de linha diretamente na cadeia de caracteres, em vez de escapar delas, \nsalva outros dois caracteres.
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);}

Compila com:

cl /DA="\"   \0   \0   \"" /DB="\"5282582468\"" /DC='o' /DD="\"0136\"" /DE="\"+---+\n\"" /Dp=printf dice.c
user23241
fonte
1
Isso é meio que trapaça com todas essas bandeiras na linha de comando? Eu não entendo a coisa / DA / DB / DC .. coisa.
Mellamokb
Meu compilador não entende a /Dopção ... Por favor, não trapaceie colocando aleatoriamente define no comando de compilação.
FUZxxl 26/07/12
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
fonte
3

F # - 165 161 caracteres

(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
fonte
3

Python 108 114 119 121 122 129

wtf! parece a primeira solução ?! mas iam não ... trapaceiro

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
fonte
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
fonte
1
+1 para usar em dievez 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
fonte
3

Haskell, 154 162 167 172 172 caracteres

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

Ele usa aproximadamente a mesma ideia que a Python.

Versão legível:

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 " "
Lambda Fairy
fonte
3

Golfscript 80 65

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

O programa pode ser testado aqui

Cristian Lupascu
fonte
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);

Outra solução PHP. Cheguei à Oleg quase na mesma solução.

Alberto Fernández
fonte
2

Python (153)

Esta não é, de longe, a menor submissão, eu apenas achei que parecia legal :)

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

Q (120 caracteres)

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

Uso:

dice[]
skeevey
fonte
2

C, 168 164 163 caracteres

Desculpe se estou um pouco atrasado para a festa, mas como nenhuma resposta foi aceita ainda, e a única outra solução C foi um pouco mais longa, aqui vai ...

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

Você pode remover o include e salvar outros 18 caracteres, mas ele não será compilado sem avisos.

Edit :
usando o truque de linha de comando do user23241 , o menor código C que produz o resultado (sem avisos do compilador) tem apenas 12 caracteres:

#include I
M

Pelo menos se você trapacear e usar a seguinte linha de comando para compilar:

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

c, 140 caracteres

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]);}
coelho bebê
fonte
1

PHP: 1284

Este é o meu segundo CodeGolf, e eu não estava realmente buscando tanto falta quanto mutabilidade de código e correspondendo aos critérios de jogo.

Você pode gerar dados de 4 lados e 6 lados.

Talvez mais tarde eu o reduza e o torne um pouco mais dinâmico.

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

Saída 4 lados:

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

Saída 6 lados:

-----
|o  |
| o |
|  o|
-----
Horizonte de eventos
fonte
1

JavaScript 220 bytes

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

Ruby, 134 132 119 118 117 112 111 caracteres,

Meu segundo golfe na vida. Eu usei números mágicos. Algum conselho, por favor?

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

Saídas:

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

VimScript - 169 caracteres

Observe que este não é o Vim puro, pois o Vim não possui um gerador de números aleatórios embutido. É claro que existem extensões que podem ser baixadas para ele, mas como eu sou um homem Linux exigente, pensei: por que não confiar apenas no ambiente do shell?

Código

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

Explicação

  • A primeira linha gera a "caixa" que representa o dado.
  • A segunda linha busca um número aleatório do ambiente e, usando aritmética modular, obriga a ser um número válido para um dado.
  • As linhas restantes se movem ao redor da face da matriz, preenchendo a o . Observe que isso deve ser otimizado para o menor número de caracteres e não o menor número de movimentos (ou seja, haveria maneiras mais rápidas de pressionar as teclas se eu o estivesse fazendo manualmente -if tudo na minha cabeça).
  • Como sempre, ^não é literal^ mas uma indicação de uma sequência de escape.

Teste

Mude RANDOMpara DICEVALUE, salve o código VimScript e dice.vim, em seguida, execute este script shell, fornecendo como argumentos os números que você deseja testar:

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

Mathematica 166 161 146 143 caracteres

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

Saída de amostra:

cinco


Se os colchetes da matriz ofenderem, você poderá substituí-lo MatrixFormpor TableFormno código.

DavidC
fonte
1

PHP 5.4, 107 bytes

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

102 bytes *

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

** Infelizmente, a versão de 102 bytes emite avisos devido à conversão de boolpara intao indexar a sequência $d. Fora isso, funciona bem. *

Dan Lugg
fonte
A contagem de bytes parece ser 105 e 100, respectivamente.
12Me21
Ah, eu devo ter explicado as novas linhas.
Dan Lugg