滚动ASCII模具


16

在此挑战中,您必须输出随机掷骰子的ascii艺术。

像这样:

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

请注意:

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

无效的输出,因为这在管芯上不可能产生结果

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。

您的程序必须像上面那样以ascii art的形式输出这些模切辊之一(建模如下,以xy和zs替换为数字),每个输出的发生概率均大于0,但概率不大于0。必须是偶数(与现实生活不同,它们可以被用作特技骰子)。您的程序无法输出无效的模版或非模版。您的程序必须具有输出有效掷骰的概率为1

请注意,您的骰子不一定非要像第一张图片所示那样是右撇子。(用右手和左手描述模具的网)

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|
  \/_______/

如果您的骰子是左撇子,则以下是有效的输出,但如果您的骰子是右撇子,则无效:

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

尽管您可以选择左手或右手,但您的骰子必须保持一致:它不能从左向右更改,反之亦然

以下是管芯的有效输出列表。有关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

再次,这是,所以字节越少越好


4
给定另外两个,求解器可能会对第三个模面的公式感兴趣。
xnor

@xnor,因此,我认为这是一个重复的问题,这是一个强有力的论点
Digital Trauma

1
我不知道在此投影中绘制任何立方体的任何ASCII艺术。尽管尺寸很小,但我不知道是否可以比在像Python这样的语言中进行硬编码更好。
xnor


实际上,@ xnor即使其中有大约7和8个char序列。
乔纳森·艾伦

Answers:


8

Python 3中,197个196 192字节

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

ideone测试

右手(切换到左撇子通过交换u*ul*l在最后一行)

束手无策-但让我们叹为观止 -特别是因为我尝试高尔夫ASCII的所有尝试,除了原始和使用老式格式都无法节省字节;
-对于n00b的任何其他高尔夫球技巧,我们将不胜感激。


1
您可以使用from random import*和保存1个字节c=choice
acrolith '16

@daHugLenny-现在我不能错过空格之前的空白了*;!!
乔纳森·艾伦

1
欢迎来到PPCG!不错的第一篇文章!
GamrCorps,2016年

谢谢@GamrCorps-我一直想做一阵子...现在我代表我可以在一个受保护的问题上发布有意义的解决方案...:D
Jonathan Allan

2
相反,有3个空格,然后的%d使用%4d,而不是它会填充它正确地为您服务。您也许还可以将其用于模具的其他部分。
价值墨水

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

在测试程序中

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

说明

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. 

5

的Javascript 238 232 207 201字节

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

取消高尔夫时是:

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

算法

考虑到在模具的8个角相交处的每个相交处,相交的模具面值是固定的,但可以出现在3个旋转中的任何一个处。例如,当向下看“ 1”,“ 2”,“ 3”角时,可以围绕通过该角的轴旋转模具,并从相反的角向外旋转,以显示“ 1”,“ 2”或“ 3”在ASCII艺术之上。

v硬编码在每个角相交的模具面,b是相对于随机角的起点的偏移,并且o是角数据内旋转的起点。ASCII文字使用console.log格式字符串写入控制台。


您可能可以通过使用`引号来节省一些字节,这些引号允许使用原义换行符,而不必一直写\n
尼尔

@Neil非常感谢,它运作良好。还删除了结尾部分';'
traktor53 '16

4

TSQL 308字节

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字节(在Server Management Studio中:查询-结果为文本)

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

注意:通过删除打印和声明部分-并直接从SELECT输出结果。但是,这在小提琴中是行不通的

小提琴


也许您可以更改ABS(a^3*b-a*b^3)为保存4个字节?(我不确定-似乎在拨弄中工作,但是它只给我一卷a,b,c = 5,1,3,所以我可能会误会)
乔纳森·艾伦

@JonathanAllan谢谢您的评论。指数在TSQL中写为POWER(a,3)。^具有不同的含义
t-clausen.dk

4

Javascript,251个字节

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

通话使用u();
很长,但这是一个答案,而且我很久没有回答了。


在ideone上输出测试的左上角缺少空格。
乔纳森·艾伦

a=()=>(0|Math.random()*6)+1;应该保存8
traktor53 '16

3

Ruby,150个字节

所有字符串格式化滥用!!!

用于获取最后一个数字的公式的功劳在此处 @xnor 。

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]

否-公式功劳归xnor
Jonathan Allan

@JonathanAllan感谢您指出我应有的信誉。无论如何,当我说您可能可以更多地利用字符串格式化来节省字节时,我想到的答案格式更多。
价值墨水
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.