科赫雪花的图形表示


13

产生科赫雪花

科赫雪花是一个三角形,每个三角形n的每一边中间都添加了另一个等边点:http : //en.wikipedia.org/wiki/Koch_snowflake#Properties

我们已经有一个 科赫雪花的挑战n=4。新的挑战是绘制n介于1和之间的任何Koch雪花10

规则

雪花可能未在程序或文件中进行硬编码-它们必须由您的程序生成。

您的程序必须支持n1到10之间的所有大小。

边数必须由用户通过std-in输入。

您必须在屏幕上打印雪花的图形表示。

n等于,1、2、3和4的样本科赫雪花(绿线仅是为了清楚起见,请勿复制它们):

科赫雪花

如果出现决胜局,具有最高投票数的程序将获胜(流行比赛)。


我没有这个意思:“您必须使用一个函数来计算像素的放置位置。如果您的程序没有为此目的内置的函数,则可以从分数中扣除实现一个的成本。 ” 什么像素?
xnor

@xnor最初是用来计算如何在每个像素/字符的基础上绘制雪花的(挑战本来也是ASCII艺术挑战)。大多数人可能只会使用线条,因此我将其删除。

一个人可以画出整个雪花吗?
xnor

当然。此评论需要更长的时间。

除此之外n=7,您无法在计算机屏幕上的雪花中看到新添加的三角形。这里有什么“尽力而为”的方法吗?基于像素的解决方案是否有最低分辨率?
xnor 2014年

Answers:


7

Mathematica 72

Region@Line@AnglePath[Nest[Join@@({#,1,4,1}&/@#)&,{4,4,4},Input[]-1]π/3]

n = 3

在此处输入图片说明

感谢alephalpha。


不错的工作。打两个字符就可以赢球!

@ Hosch250更新,谢谢。
chyanog 2015年

您可以AnglePath在Mathematica 10.1中使用。
alephalpha

@chyaongGraphics@Line@AnglePath[Nest[Join@@({-1,2,-1,#}&/@#)&,{2,2,2},Input[]-1]Pi/3]
alephalpha

1
@alephalpha 73个字符:ListLinePlot@AnglePath[Nest[Join@@({#,1,4,1}&/@#)&,{4,4,4},Input[]-1]π/3]
chyanog

15

MATLAB,119 115

在不寻常的事件中,我发现当我打高尔夫球时,该程序实际上效果更好。首先,由于矢量化,它变得更快。现在,它显示一个有用的提示,~n:~提醒用户输入哪个数量!

换行符不是该程序的一部分。

x=exp(i*pi/3);
o='~n:~';
P=x.^o;
for l=2:input(o);
P=[kron(P(1:end-1),~~o)+kron(diff(P)/3,[0 1 1+1/x 2]) 1];
end;
plot(P)

n = 9: n = 9

o是一个等于[0 2 4 0]模6 的任意字符串。eiπ/ 3乘以这些幂可得出复平面上等边三角形的顶点。第一个kron用于制作点列表的副本,每个副本重复4次。~~o是获得4个向量的便捷方法。其次diff(P)找到每对连续点之间的向量。此向量的倍数(0、1 / 3,(1 + e- iπ/ 3)/ 3和2/3)被添加到每个旧点。


恩,您能否进一步解释一下这段代码的工作原理?我以为我认识一些Matlab,但这是……精神错乱?=)
瑕疵的

@flawr我添加了一些注释,这有帮助吗?
feersum

非常感谢你!我要谨记这个滥用字符串的技巧=)
更加模糊的

9

T-SQL:686(不包括格式)

对于SQL Server 2012+。

即使这永远不会成为竞争者,我也必须看看是否可以在T-SQL中完成它。从三个初始边缘开始,然后遍历每个边缘并为每个级别用4个边缘替换它们的方法已经一去不复返了。最后,将其全部合并为单个几何体,以指定@i

DECLARE @i INT=8,@ FLOAT=0,@l FLOAT=9;
WITH R AS(
    SELECT sX,sY,eX,eY,@l l,B,1i
    FROM(VALUES(@,@,@l,@,0),(@l,@,@l/2,SQRT(@l*@l-(@l/2)*(@l/2)),-120),(@l/2,SQRT(@l*@l-(@l/2)*(@l/2)),@,@,-240))a(sX,sY,eX,eY,B)
    UNION ALL
    SELECT a.sX,a.sY,a.eX,a.eY,l/3,a.B,i+1
    FROM R 
        CROSS APPLY(VALUES(sX,sY,sX+(eX-sX)/3,sY+(eY-sY)/3,sX+((eX-sX)/3)*2,sY+((eY-sY)/3)*2))x(x1,y1,x2,y2,x3,y3)
        CROSS APPLY(VALUES(x2+((l/3)*SIN(RADIANS(B-210.))),y2+((l/3)*COS(RADIANS(B-210.)))))n(x4,y4)
        CROSS APPLY(VALUES(x1,y1,x2,y2,B),
            (x3,y3,eX,eY,B),
            (x2,y2,x4,y4,B+60),
            (x4,y4,x3,y3,B-60)
        )a(sX,sY,eX,eY,B)
WHERE @i>i)
SELECT Geometry::UnionAggregate(Geometry::Parse(CONCAT('LINESTRING(',sX,' ',sY,',',eX,' ',eY,')')))
FROM R 
WHERE i=@i

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


我不知道使用T-SQL可以实现这种巫术!
2015年

9

徽标:95

to w:c ifelse:c=1[fd 2 lt 60][w:c-1 w:c-1 lt 180 w:c-1 w:c-1]end
to k:c repeat 3[w:c rt 180]end

k用单个级别参数定义功能。

编辑

在此在线编辑器http://www.calormen.com/jslogo/中,您可以添加k readword使用提示符进行输入,但是由于某些原因,此命令不支持标准缩写rw

下面的102个字符的解决方案在USBLogo中可以使用问题中指定的标准输入。但是,由于UCBLogo具有一些奇怪的解析器,因此代码需要稍作更改。它需要toend必须在单独的行和空间中,然后:才是必需的,但另一方面:是可选的。

to w c
ifelse c=1[fd 2 lt 60][w c-1 w c-1 lt 180 w c-1 w c-1]
end
to k c
repeat 3[w c rt 180]
end
k rw

您如何运行LOGO?
Beta Decay

@BetaDecay我使用了这个:logo.twentygototen.org,但这是我发现的第一个:calormen.com/jslogo您还可以安装USBLogo
nutki 2014年

8

英国广播公司BASIC,179

修订版1

INPUTn
z=FNt(500,470,0,0,3^n/9)END
DEFFNt(x,y,i,j,a)
LINEx-36*a,y-21*a,x+36*a,y-a*21PLOT85,x,y+a*42IFa FORj=-1TO1FORi=-1TO1z=FNt(x+24*a*i,y+j*14*a*(i*i*3-2),i,j,-j*a/3)NEXTNEXT
=0

和以前一样,但有黑色和白色,有无高尔夫球(但精简)和高尔夫球版本。尽管这样做确实不是赢家,但可以避免对n = 1的特殊处理。

  INPUTn
        REM call function and throw return value away to z
  z=FNt(500,470,0,0,3^n/9)
  END

        REM x,y=centre of triangle. a=scale.
        REM loop variables i,j are only passed in order to make them local, not global.
  DEFFNt(x,y,i,j,a)

        REM first draw a line at the bottom of the triangle. PLOT85 then draws a filled triangle,
        REM using the specified point (top of the triangle) and the last two points visited (those used to draw the line.)
  LINEx-36*a,y-21*a,x+36*a,y-21*a
  PLOT85,x,y+42*a

        REM if the absolute magnitude of a is sufficient to be truthy, recurse to the next level.
        REM j determines if the triangle will be upright, inverted or (if j=0) infinitely small.
        REM i loops through the three triangles of each orientation, from left to right.
  IFa FORj=-1TO1 FORi=-1TO1:z=FNt(x+24*a*i,y+j*14*a*(i*i*3-2),i,j,-j*a/3):NEXT:NEXT

        REM return 0
  =0

在此处输入图片说明

修订版0

根据OP对@xnor的回答,填充雪花就可以了。这个答案的灵感来自xnor的评论。颜色只是为了娱乐并展示其构造方式。取一个三角形(在这种情况下为洋红色),并以6个三角形(底数的1/3)叠加。

  INPUTn
  z=FNt(500,470,n,1,0,0)
  END

  DEFFNt(x,y,n,o,i,a)
  a=3^n/22
  GCOLn
  MOVEx-36*a,y-o*21*a
  MOVEx+36*a,y-o*21*a
  PLOT85,x,y+o*42*a
  IFn>1FORi=-1TO1:z=FNt(x+24*a*i,y+14*a*(i*i*3-2),n-1,-1,i,a):z=FNt(x+24*a*i,y-14*a*(i*i*3-2),n-1,1,i,a)NEXT
  =0

在此处输入图片说明


1
我喜欢其中7个合并在一起的样子。

@ hosch250确实,我似乎已经“发明”了一个新的分形,其轮廓恰好是科赫雪花,如果删除品红色部分,则会剩下6个较小的科赫雪花。高尔夫球版将只是一个纯黑色的轮廓,但我也将保留此图像。
级圣河

您是BBC Basic还是BBC BASIC?我选择后者,但我不知道它是否正确...
Beta Decay

2
@BetaDecay BASIC是初学者的通用标准/符号指令代码的反义词。“标准”位值得商as,因为有很多变体。en.wikipedia.org/wiki/BASIC。BASIC的大多数变体都倾向于使用大写形式,但根据Wikipedia页面,Visual Basic倾向于小写。我认为BBC BASIC出厂时是大写的。我正在bbcbasic.co.uk/bbcwin/bbcwin.html使用该版本。它在网站和IDE中是大写的,所以我想大写的版本更正确。但我认为这并不重要。
级圣河

嗯,好的,我继续大写版本
Beta Decay

8

Mathematica-177

r[x_, y_] := Sequence[x, RotationTransform[π/3, x]@y, y]
Graphics@Polygon@Nest[
 ReplaceList[#, {___, x_, y_, ___}  Sequence[x,r[2 x/3 + y/3, 2 y/3 + x/3], y]
  ] &, {{0, 0}, {.5, √3/2}, {1, 0}, {0, 0}}, Input[]]

在此处输入图片说明

可变的中间片角度夹

在此处输入图片说明


6

Python 3-139

使用乌龟图形库。

from turtle import*
b=int(input())
a=eval(("FR"*3)+".replace('F','FLFRFLF')"*~-b)
for j in a:fd(9/b*("G">j));rt(60*(2-3*("Q">j))*("K"<j))])

凉。我喜欢您的基于字符串的方法,只需不到两行代码即可找到形状!但是你不能检查"G">j"Q"<j并用fd(9/b)节省3个字节?此外,您可以避免if语句("G">j)与参数相乘,例如9/b将它们全部放在一行中for。哦! 然后,你甚至可以组合rtlt使用120*(...)-60*(...)
Falko

这似乎呈现了Koch雪花输入+1。输入1应该只是一个三角形,如上图所示。

@Falko感谢您提供的所有帮助!
Beta Decay's

@ hosch250编辑
Beta Decay

现在它什么也没画,输入1会产生除以0的错误。

4

Python 3,117个字节

from turtle import*
ht();n=int(input())-1
for c in eval("'101'.join("*n+"'0'*4"+")"*n):rt(60+180*(c<'1'));fd(99/3**n)

方法:

  • 该解决方案使用Python的turtle图形。
  • ninput - 1
  • 从字符串开始,0000我们101 n使用eval技巧反复将其每个字符与时间连接起来(这要感谢@xnor)。
  • 对于最终字符串中的每个字符,我们根据字符值(10)向右旋转60度或向左旋转120度,然后向前移动一个长度(99/3^n),以确保所有字符的大小相似n
  • 0字符串中的最后一个将是无用的,但它只会重0画与第一个绘制相同的线条。

输出示例input = 3

科赫


2

R:240 175

因为我试图绕过R,所以这里是另一个版本。可能有很多更好的方法可以做到这一点,我很高兴收到指针。我所做的事情似乎很令人费解。

n=readline();d=c(0,-120,-240);c=1;while(c<n){c=c+1;e=c();for(i in 1:length(d)){e=c(e,d[i],d[i]+60,d[i]-60,d[i])};d=e};f=pi/180;plot(cumsum(sin(d*f)),cumsum(cos(d*f)),type="l")

在此处输入图片说明


2

明智的选择你...

我知道我想尝试使用TURT在Befunge-98中实现此功能,但是我不知道该怎么做,所以我坐了几个月。现在,直到最近,我才找到了一种无需自我修改的方法!所以...

带有TURT指纹的Befunge-98,103

;v;"TRUT"4(02-&:0\:0\1P>:3+:4`!*;
>j$;space makes me cry;^
^>1-:01-\:0\:01-\:0
0>I@
^>6a*L
^>ca*R
^>fF

首先让我们先了解一些实现细节:

  • 我使用CCBI 2.1对其进行了测试,该软件的TURT(乌龟图形指纹)实现使I图像“打印”到SVG文件。如果您在没有命令参数的情况下在CCBI中运行此--turt-line=PATH文件,则默认情况下它将以名为CCBI_TURT.svg的文件形式出现。这是我可以找到的,与可用的Funge解释器最接近的“在屏幕上打印雪花的图形表示”。也许有一天,那里会有更好的解释器,上面有海龟的图形显示,但是现在...
  • CCBI的末尾必须有一个换行符才能不挂起而运行它(字符计数中已包括该字符)。我知道,对吧?

基本上,这是通过将堆栈用作一种临时L系统并动态扩展它来工作的。每次通过时,如果堆栈上的最高编号为:

  • -2,然后打印并停止;
  • -1,乌龟逆时针旋转60度;
  • 0,顺时针旋转120度;
  • 1,它会向前移动(此处增加15像素,但您可以通过修改f最后一行的进行更改);
  • 一些数Ñ这是2或更大,则堆栈上展开n-1, -1, n-1, 0, n-1, -1, n-1

对于n = 10,此过程需要很长的时间(在我的系统上为几分钟),并且生成的SVG大小约为10MB,在浏览器中查看时不可见,因为您无法使用TURT调整画笔的大小。如果您拥有正确的插件,IrfanView似乎可以正常工作。我对SVG并不是很熟悉,所以我不知道查看这些文件的首选方法是什么(尤其是当它们很大时)。

嘿,至少它能起作用 -考虑到它是Befunge,它本身就值得感谢。


1

Python 2,127字节

from turtle import *
def L(l,d=input()-1):
 for x in[1,-2,1,0]:[L(l,d-1),rt(60*x)] if d>0 else fd(l)
for i in'lol':lt(120);L(9)

1
非常感谢在这里拥有第50,000个职位。
安德鲁
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.