以ASCII绘制骰子结果


25

如果用立方体形骰子完成,则显示掷骰子的随机结果,以ASCII表示。

$ dice

应该导致以下结果之一

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

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

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

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

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

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

4
您尚未在此处定义指标。这是否意味着成为标准高尔夫?总是值得在拼图实验室聊天室meta上沙盒中讨论可能的任务,以便您可以在上线之前解决这类问题。
dmckee,2011年

抱歉,我认为指标始终是字符数?感谢您将我指向聊天,然后在meta上打沙。如果这个问题直截了当,那么我将其删除。我讨厌现在就做,以防万一有人开始研究它。
乔纳斯·艾夫斯特伦2011年

啊...请记下站点名称“ Programming Puzzles and Code Golf”(是的,我也认为它的扫描效果更好)。您还会发现单线山丘之王锦标赛代码挑战(其他所有内容,但您仍应建立一个获胜的客观指标),因此有必要说出并运用适当的方法标签。
dmckee,2011年

13
根据XKCD#221alert('-----\n|o o|\n| |\n|o o|\n-----');是正确的程序。
JiminP 2011年

9
如果您删除了ascii-art标签,我可以提供我的39char解决方案print("⚀⚁⚂⚃⚄⚅"(util.Random.nextInt(6)))(utf-art)。
用户未知

Answers:


7

Golfscript,56个字符

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

该解决方案可以在这里进行测试


25

Python中,112 110个字符

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
数组索引器中的那些比较完全令人印象深刻!
乔纳斯·艾夫斯特伦2011年

2
同上!我也喜欢您如何使用模具的对称性:)
System Down

你能用类似的东西id(0)%7%6吗?它不会是一个均匀的分布,但是要短得多……
2011年

@Nabb:不是很随意。特别是,每次运行时它通常是相同的,因此在生成随机骰子掷骰中并不是很有用。
基思·兰德尔


7

Windows PowerShell,89 93 96 97 101 119个字符

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

5

Python,109个unicode字符

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

注意:此函数未使用随机函数,因此不会像其他函数那样随机。


5

Perl,74个字符

用运行perl -M5.010

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

(请注意,清单中的换行符是字符串的一部分,而不仅仅是为了清楚起见而插入。)

如果您想知道该$->$操作的用途,那么以下阅读说明可能会有所帮助:

  • 变量会$-自动将其分配的值截断为整数。

  • 该变量$"预设为单个空格。

  • o是一个裸字(表示"o")。


4

第一次高尔夫球手

Python,161个字符

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

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

请注意,换行符很重要。与这些愚蠢的“现代”语言不同,Common Lisp倾向于可读性而非简洁性,因此我们拥有繁琐的“ concatenate'string ...”构造,并且没有简洁的方式来引用字符串中的字符。


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

看起来不是很正确,alert因为它不是固定宽度的字体,但是请放心它是正确的,或者通过发出<pre>标签并进行writeln:-)进行测试

证明:http//jsfiddle.net/d4YTn/3/(仅适用于JS 1.7兼容的浏览器,例如FF2 +)

鸣谢:Math@minitech的欺骗技巧和@Keith的打印逻辑死机。

编辑Math从@minitech 删除把戏,因为它实际上使它更长:-)

编辑2:保存17个字符。@Keith借用骰子对称性的技巧。使用技巧简化将随机数转换为int的过程。

编辑3:删除1+以将随机数从1-6转换为0-5,并保存2个字符。结果,我也可以更改r%2-1r%2并保存另外2个字符。

编辑4:jsfiddle再次工作。更新 :-)


E4X!而且我不敢相信Chrome不支持它!
Ry- 2011年

嘿,我终于击败了你:)
Ry

现在,使用您的|0把戏两个字符:-)
Ry- 2011年

它适用于Chrome。
pimvdb 2011年

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

击败mellamokb,但我完全改变了原来的解决方案。如果您希望它看起来不错,请使用Google Chrome或其他工具,将其更改alertconsole.log,然后更改。

编辑:借用了mellamokb的| 0技巧来保存一些字符。


@minitech:顺便说一句,M=Math我试图窃取的trick 俩实际上最终变成了一个字符的更长
mellamokb

@mellamokb:我知道,我原本以为我会更多地使用它...
Ry-

@minitech:您可以使用[s.substr(0,3),s.substr(3,3),s.substr(6,3)].join('|\n|')
mellamokb

1
@mellamokb:不 s是一个数组。我将重新启动,然后重试。
Ry-

@minitech:我们再来一遍:-)通过竞争演变出最佳答案。现在我降至137,但是您可以借用我的把戏之一,并节省10个字符。
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);

?>可以省略结尾,节省2个字符。
Ry- 2011年

您可以内联的声明$r,保存另一个字符。后面的空格echo也可以省略。您也可以内联初始化$a,将您带到128。将换行符直接放入字符串中,而不是使用转义符将其转义,这\n将另外节省两个字符。
乔伊,

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

编译为:

cl /DA="\"   \0   \0   \"" /DB="\"5282582468\"" /DC='o' /DD="\"0136\"" /DE="\"+---+\n\"" /Dp=printf dice.c

1
那是不是在命令行上欺骗了所有这些标志?我不了解/ DA / DB / DC ..东西。
mellamokb

我的编译器不了解该/D开关...请不要通过在编译命令中放入随机定义来作弊。
FUZxxl 2012年

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#-165161个字符

(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!看起来像第一个解决方案?但我不是...作弊者

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 die代替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个字符

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

它使用与Python大致相同的想法。

可读版本:

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



2

巨蟒(153)

到目前为止,这并不是最小的提交,我只是认为它看起来不错:)

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个字符)

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

用法:

dice[]

2

C, 168 164 163个字符

抱歉,如果我来晚了一点,但是由于尚未接受任何答案,并且唯一的其他C解决方案更长,因此这里...

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

您可以删除include并保存另外18个字符,但是它不会在没有警告的情况下编译。

编辑
使用user23241的命令行技巧,生成结果的最短C代码(无编译器警告)仅为12个字符:

#include I
M

至少如果您作弊并使用以下命令行进行编译:

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个字符

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

这是我的第二个CodeGolf,我并没有真正着眼于代码的可变性和匹配游戏标准。

您可以生成4面骰子和6面骰子。

也许以后我会缩短它并使它更具动态性。

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

输出4面:

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

输出6面:

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

1

JavaScript 220字节

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

红宝石,134132119118117112 111字符,

我人生中的第二次高尔夫。我用了魔术数字。有什么建议吗?

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

输出:

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个角色

注意,这不是纯Vim,因为Vim没有内置的随机数生成器。当然,可以下载一些扩展,但是由于我是一位顽固的Linux专家,所以我想,为什么不仅仅依靠shell环境。

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

说明

  • 第一行生成代表模具的“盒子”。
  • 第二行从环境中获取一个随机数,并使用模块化算法将其强制为骰子的有效数。
  • 其余的线围绕填充的的模具面移动o。请注意,这是针对最少的字符数而不是最少的移动数进行优化的(即,如果我手动进行击键,轮流会有更快的方法-尽if一切可能)。
  • 与往常一样,^它不是文字,^而是指示转义序列。

测试中

更改RANDOMDICEVALUE,将VimScript代码保存到中dice.vim,然后在其上运行此shell脚本,并为您提供要测试的数字作为参数:

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

1

数学166 161 146 143个字符

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

样本输出:

five


如果矩阵大括号冒犯了,您可以在代码MatrixForm中用代替TableForm


1

PHP 5.4,107字节

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

102字节*

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

**不幸的是,由于在索引字符串时强制转换为boolto ,因此102字节版本会发出通知。除此之外,它工作正常。*int$d


字节数似乎分别为105和100。
18Me21年

啊,我一定已经考虑了换行符。
丹·拉格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.