绘制Sierpinski箭头曲线


14

介绍

谢尔宾斯基箭头曲线是一条曲线,这是限制是谢尔宾斯基的三角。

它首先是这样开始的:

 _
/ \

然后,将每一行替换为第一行的旋转版本:

  _
 / \
 \ /
_/ \_

下一个:

     _
    / \
    \ /
   _/ \_
  /     \
  \_   _/
 _  \ /  _
/ \_/ \_/ \

Sierpinski箭头曲线演变

你的任务

给定数字n,输出Sierpinski箭头曲线的第n次迭代。

您可以选择0或1索引,但请在答案中指定。

您可以生成图像,或以我上面的格式使用Ascii Art。

您可能不使用内置函数生成此曲线。

请记住,这是,所以字节最少的代码将获胜。

Answers:


14

八度,240个236 221字节

这是通过与此处使用的相同想法完成的但是我不得不对其进行更改以适合sierpinsky箭头曲线。

m=input(0);g=2*pi/6;u=cos(g);v=sin(g);A=[1,0];B=[u,v];C=[-u,v];D=-A;E=-B;F=-C;for k=1:m;f=[E;F;A];b=[A;B;C];A=[B;A;F];d=[C;D;E];C=[D;C;B];E=[F;E;D];B=b;D=d;F=f;end;A=[0,0;cumsum(A)];plot(A(:,1),A(:,2));axis off;axis equal

在此处输入图片说明


u=.5;v=3^u/2;B=[u,v];C=[-u,v];A=C<0;短16个字节:)您还axis off equal可以保存另外5个字节。
Stewie Griffin

3

Haskell +图,176字节

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
瑕疵的

@flawr,它很棒,但是可以应用通常的Haskell图形程序警告。只需调用等价的plot() 即可打开窗口。
2016年

2

MSWLogo(版本6.5b),102字节

接受此处给出的两个函数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 :alt :a向右旋转乌龟(追踪其路径的三角形东西),以:a度为单位。
  • fd :l 将乌龟向前移动 :l逐步。

:a等于60 的函数被调用。

箭头

在这里,repeat本质上是一个带有内置counter的FOR循环repcountpupd平均“笔向上”和“落笔”,这从而其位置是使用作为集描绘停止龟setxy

每次迭代的图形都以:l等于的长度进行调用power 2 (7-repcount),该长度成倍减小;这是因为定义:l在递归步骤中使用的是相同的,因此在固定:l的情况下,输出的整体大小将随着呈指数增长:n


这是适合该工作的语言,但是从技术上讲,不允许有多余的数据,因此理想情况下,您应在答案中编码60。
尼尔

@Neil所以我只包括 60字节数吗?
莫妮卡

我不确定是否这么简单,但是我自己并不知道该语言。
尼尔

1

Python 2,124字节

基于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是一条直线。


您必须将代码更改为使用60度角,否则它不会接近Sierpinsky三角形。另外,方向会根据顺序而变化,我认为这是不正确的。trinket.io/python/a803546939
mbomb007 '16

徽标答案还提供了将角度作为参数的功能,所以我认为可以。就方向而言,它仍然是相同的曲线,只是旋转了。
BookOwl

徽标答案始终是相同的旋转。每个订单的轮换方式都不一样,而且不尽相同。不好 看问题包含的图片。
mbomb007 '16

挑战在哪里说旋转必须相同?
BookOwl

1
任何数学专业都可以告诉您限制必须收敛。你没有。
mbomb007 '16

1

Mathematica / Wolfram语言73个字节

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

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


0

Mathematica,62个字节

Graphics@Line@AnglePath[Pi/3Nest[Flatten@{-#,1,#,1,-#}&,0,#]]&

这是如何运作的?
BookOwl

0

JavaScript(ES6),180个字节

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