Answers:
import Diagrams.Prelude
import Diagrams.Backend.SVG
g n=renderSVG"a"(mkWidth 99).strokeT.a n
a 0=hrule 1
a n|b<-a(n-1)=b%6<>b<>b%(-6);a%n=rotateBy(1/n).reflectY$a::Trail V2 Double
制作具有透明背景的svg文件,称为“ a”。
g 0
输出一条水平线,g 1
是/¯\
。
Diagrams
!
plot()
即可打开窗口。
接受此处给出的两个函数shapeL
,并通过添加额外的参数来合并它们shapeR
:a
在取反时调用相反的函数。
to s :n :a :l
if :n=0[fd :l stop]
rt :a
s :n-1(-:a):l
lt :a
s :n-1 :a :l
lt :a
s :n-1(-:a):l
rt :a
end
s
定义了一个函数,该函数需要迭代次数:n
(从1开始),angle :a
和length :l
。它是递归的,:a
在两个实例中取反的角度调用其自身的较低迭代,以获取正确的方向。
rt :a
, lt :a
向右旋转乌龟(追踪其路径的三角形东西),以:a
度为单位。fd :l
将乌龟向前移动 :l
逐步。:a
等于60 的函数被调用。
在这里,repeat
本质上是一个带有内置counter的FOR循环repcount
。pu
和pd
平均“笔向上”和“落笔”,这从而其位置是使用作为集描绘停止龟setxy
。
每次迭代的图形都以:l
等于的长度进行调用power 2 (7-repcount)
,该长度成倍减小;这是因为定义:l
在递归步骤中使用的是相同的,因此在固定:l
的情况下,输出的整体大小将随着呈指数增长:n
。
60
字节数吗?
基于Wikipedia文章中的代码。
from turtle import*
def c(o,a):
if o:o-=1;c(o,-a);lt(a);c(o,a);lt(a);c(o,-a)
else:fd(9)
n=input()
if n%2==0:lt(60)
c(n,60)
阶数0是一条直线。
s=1;Region@Line@AnglePath[Nest[Join@@({#,s=-s,s}&/@#)&,{#~Mod~2},#]Pi/3]&
简单说明:
AnglePath [{θ1,θ2,θ3,…}]给出一个二维坐标列表,该列表对应于从{0,0}开始的路径,然后以连续的相对角度θi进行一系列单位长度的步骤。
n = 1
Graphics@Line@AnglePath[60°{1,-1,-1}]
n = 2
Graphics@Line@AnglePath[60°{0,1,1, -1,-1,-1, -1,1,1}]
n = 3
Graphics@Line@AnglePath[60°{1,-1,-1, 1,1,1, 1,-1,-1, -1,1,1, -1,-1,-1, -1,1,1, -1,-1,-1, 1,1,1, 1,-1,-1}]
f=(n,d=0,r=n=>` `.repeat(n))=>n?f(--n,d=3-d%3).map(s=>r([l=s.length/2,0,1,~n&1][d]+l)+s+r([,1,0,~n&1][d]+l)).concat(f(n,d+1).map(s=>s+r(!(d%3))+a.shift(),a=f(n,d+2))):[`_/\\`[d%3]]
<input type=number min=1 oninput=o.textContent=f(this.value).join`\n`><pre id=o>
返回字符串数组。正确设置间距是最困难的部分!205个字节的纯字符串版本:
f=(n,d=0,r=n=>` `.repeat(n))=>n?f(--n,d=3-d%3).replace(/.+/g,s=>r([l=s.length/2,0,1,~n&1][d]+l)+s+r([,1,0,~n&1][d]+l))+`\n`+f(n,d+1).replace(/.+/g,s=>s+r(!(d%3))+a.shift(),a=f(n,d+2).split`\n`):`_/\\`[d%3]
u=.5;v=3^u/2;B=[u,v];C=[-u,v];A=C<0;
短16个字节:)您还axis off equal
可以保存另外5个字节。