我喜欢毕达哥拉斯的树


17

...所以要让我成为一棵树是一个挑战。

生成一个名为tree的程序或函数,该程序或函数采用一个整数参数N,并绘制一个N层深的勾股树,其中0层只是树干。

树的每个结点都应将三角形的顶点放置在周长上的任意点上(此点应均匀分布在至少5个等距的点上,或均匀分布在整个半圆上)。

根据您的时间,您的树也可以是3d,彩色或点亮。但是,这是代码高尔夫球,因此最小的文件为准。

编辑:一周之后,我将关闭比赛并接受最小的答案



假。我正在使用其他算法:)
亚历山大·布雷特

好。很公平。您可能要考虑取消对“毕达哥拉斯树”的提交。
DavidC

我喜欢火车?:)
tomsmeding

Answers:


15

数学,246 234 221个字符

g[n_,s_:1]:={p=RandomReal[q=Pi/2],r=##~Rotate~(o={0,0})&,t=Translate}~With~If[n<0,{},Join[#~t~{0,s}&/@(#~r~p&)/@g[n-1,s*Cos@p],t[#,s{Cos@p^2,1+Sin[2p]/2}]&/@(r[#,p-q]&)/@g[n-1,s*Sin@p],{Rectangle[o,o+s]}]]
f=Graphics@g@#&

当然,这不是最优雅/最短的方法。

用法: f[8]

在此处输入图片说明

这里有例如用于输出f[6]f[10]分别。

在此处输入图片说明 在此处输入图片说明

有点不符合要求:

g[n_, s_:1] := With[{p},
  r = Rotate;
  t = Translate;
  p = RandomReal[q = Pi/2];
  If[n < 0, {},
   Join[
    (t[#, {0, s}] &) /@ (r[#, p, {0, 0}] &) /@ g[n - 1, s*Cos[p]],
    (t[#, s {Cos[p]^2, 1 + Sin[2 p]/2}] &) /@ (r[#, p - q, {0, 0}] &) /@
       g[n - 1, s*Sin[p]],
    {Rectangle[{0, 0}, {s, s}]}
    ]
   ]
  ]
f = Graphics@g[#] &

那真是令人印象深刻。不好意思,我没有mathematica可以测试它-您可以再添加几个示例输出吗?
亚历山大·

@ ali0sha参见编辑
Martin Ender

您不需要Show在那里,Module也是不必要的。
沙沙

@swish感谢您的Show提示,但是我该如何摆脱Module呢?如果我不声明p本地,它将在递归调用中被覆盖,所以我不能用相同的两个调用p,对吗?
Martin Ender 2014年

@ m.buettner也许您可以使用Block,它比短Module
alephalpha 2014年

20

CFDG,134个字符

这不是完全有效,因为您不能限制递归深度。但是问题只是在此方面需要解决方案。:)

startshape t
c(q)=cos(q/2)^2
d(q)=1+sin(q)/2
p=acos(-1)
shape t{w=rand(p)
SQUARE[x .5 .5]t[trans 0 1 c(w) d(w)]t[trans c(w) d(w) 1 1]}

结果看起来像这样

在此处输入图片说明

对于另外46个字符(总共180个字符),您甚至可以使用以下颜色:

startshape t
c(q)=cos(q/2)^2
d(q)=1+sin(q)/2
p=acos(-1)
shape t{w=rand(p)
SQUARE[x .5 .5 h 25 sat 1 b .2]t[trans 0 1 c(w) d(w) b .08 .8 h 2.2]t[trans c(w) d(w) 1 1 b .08 .8 h 2.2]}

在此处输入图片说明


我知道这还不是完全的主题,但是如果您使用“棕色噪声”作为角度而不是“白色噪声”,那么一个版本的外观如何?
ɐɔıʇǝɥʇuʎs

@Synthetica您的意思是在90°处有更多的角度,在0和180度处有更少的角度?
Martin Ender 2014年

@Synthetica 与此类似。我无法实现实际的随机游走噪声,因为这需要获取一个输入参数(最后一个随机值),对其进行调整并将其传递。这会使语法上下文敏感,因此CFDG不支持。我通过使用随机样本上的简单三次函数将随机值进一步推向π/ 2来稍微弄虚作假。
Martin Ender 2014年

我认为您的imgur链接已损坏,尽管我喜欢这种颜色和形状,但我还是非常想知道,由于您提到的原因,我不得不取消这一资格
alexander-brett 2014年

@ ali0sha,您是对的,这是固定链接。取消这一资格绝对是公平的,我只想与一些人分享Context Free Art,这似乎是解决问题的一种巧妙方法。;)...好吧,我仍然有Mathematica的答案^^
Martin Ender 2014年

4

后记,322 270

编辑:似乎realtime不能用作适当的随机生成器种子。因此,我们将为此使用环境变量并像这样运行程序:

gs -c 20 $RANDOM -f tree.ps

要么

gswin32c -c 20 %RANDOM% -f tree.ps

现在,我们的树木难以预测。14个字节被添加到总数中。其他更改:1)现在在命令行上传递了程序参数。2)没有明确的迭代计数器-堆栈大小用于此目的(左分支旋转角度存储在堆栈上,以便稍后绘制右分支)。3)没有所需深度的命名变量-堆栈大小是其在堆栈上的偏移量。它留在出口处,即不消耗。

srand
250 99 translate
50 50 scale
/f{
    count
    dup index div dup 1 le{
        0 exch 0 setrgbcolor
        0 0 1 1 rectfill
        0 1 translate
        rand 5 mod 1 add 15 mul
        gsave
        dup rotate
        dup cos dup scale
        f
        grestore
        dup cos dup dup mul
        exch 2 index sin mul translate
        dup 90 sub rotate
        sin dup scale 1
        f
        pop
    }{pop}ifelse
}def
f

我认为这很明显-图形状态已准备好,并且f对于每个连续的深度级别,都为“左”和“右”分支递归调用了两次过程。使用矩形1x1大小(请参见原始比例)可以避免乘以边长的麻烦。左分支的旋转角度是随机的-使用了5个随机等距的除法之一-我认为它可以防止出现统一情况下的丑陋情况。

所需深度超过20左右可能会很慢。

接下来是高尔夫版本,使用ASCII编码的二进制令牌(请参阅链接主题中的luser droog的答案)。注意,cossinrand不能使用此记号。

/${{<920>dup 1 4 3 roll put cvx exec}forall}def srand 250 99<AD>$ 50 50<8B>$/f{count(8X68)$ 1 le{0(>)$ 0<9D>$ 0 0 1 1<80>$ 0 1<AD>$ rand 5 mod 1 add 15<~CecsG2u~>$ cos<388B>$ f(M8)$ cos(88l>)$ 2(X)$ sin<6CAD38>$ 90<A988>$ sin<388B>$ 1 f pop}{pop}(U)$}def f

/${{<920>dup 1 4 3 roll put cvx exec}forall}def
srand
250 99<AD>$
50 50<8B>$
/f{
count(8X68)$
1 le{
0(>)$ 0<9D>$
0 0 1 1<80>$
0 1<AD>$
rand 5 mod 1 add 15 
<~CecsG2u~>$
cos<388B>$ 
f
(M8)$
cos(88l>)$
2(X)$ sin<6CAD38>$
90<A988>$ sin<388B>$
1
f
pop
}{pop}(U)$
}def
f

在此处输入图片说明


我认为这里的风格是需要添加命令行参数,因此得分为344。。。我不得不说,即使是按代码高尔夫标准,这也很吸引人。使用二进制令牌可以获取多远?您肯定离Mathematica不远
亚历山大·布雷特

@ ali0sha -dGraphicsAlphaBits是抗锯齿输出的标志,以防止较大正方形的锯齿状边缘,可以省略(或在例如环境变量中“隐藏”)。有些人可能会更喜欢没有此标志(树的叶子具有更多的“体积”)。好吧,那20个字节并不重要。我会说使用ASCII编码的二进制令牌可以减少20%到25%(根据链接的主题答案判断)。也许不使用ASCII编码即可享受50%的折扣,每个系统名称令牌2个二进制字节。看起来像一些通常会胜出的语言;)
user2846289 2014年

我认为您应该这样做-在这里让它更具竞争力:)
亚历山大·布雷特

3

Coffeescript 377B 352B

我写咖啡脚本很脏,但是找不到适合python3的绘图包:-/

Q=(n)->X=(D=document).body.appendChild(C=D.createElement('Canvas')).getContext('2d');C.width=C.height=400;M=Math;T=[[175,400,50,i=0]];S=M.sin;C=M.cos;while [x,y,l,a]=T[i++]
 X.save();X.translate x,y;X.rotate -a;X.fillRect 0,-l,l,l;X.restore();T.push [e=x-l*S(a),f=y-l*C(a),g=l*C(b=M.random()*M.PI/2),d=a+b],[e+g*C(d),f-g*S(d),l*S(b),d-M.PI/2] if i<2**n

JavaScript 393B 385B

在javascript中稍微漂亮一点,我对for循环更满意,但是如果没有[x,y,z] = A语法,我简直不能说短到足以击败coffeescript

function Q(n){X=(D=document).body.appendChild(C=D.createElement('Canvas')).getContext('2d');C.width=C.height=600;M=Math;T=[[275,400,50,i=0]];while(A=T[i++]){X.save();X.translate(x=A[0],y=A[1]);X.rotate(-(a=A[3]));X.fillRect(0,-(l=A[2]),l,l);X.restore();S=M.sin;C=M.cos;i<M.pow(2,n)&&T.push([e=x-l*S(a),f=y-l*C(a),g=l*C(b=M.random()*M.PI/2),d=a+b],[e+g*C(d),f-g*S(d),l*S(b),d-M.PI/2])}}

不得不说我有点高兴,这几乎是mathematica解决方案时间的两倍:-/实际使用它:http : //jsfiddle.net/FK2NX/3/


一些建议:在CoffeeScript中,可以使用分号代替换行符来保存至少16个字符。在这两种情况下,如果有任何一个Xreturn 方法X,都可以将它们链接起来。您还可以通过保存M.sinM.cos使用单字符变量来保存另一组好的字符。
Martin Ender

不幸的是,上下文操作不会返回上下文,这让我很不高兴。另外,您可以将M.sin重命名为Ms,但是Ms = M.sin行占用的字符数超过了保存的字符数...我将看一下删除空格的过程。
亚历山大·布雷特

不,你可以做s=M.sin
Martin Ender 2014年

我怎么能做S = M.sin但不能做R = X.rotate?
亚历山大·布雷特2014年

我想rotate使用thissin但不使用。您需要做类似的事情R=X.rotate.bind(X),但这可能不再值得了。
Martin Ender 2014年
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.