画五角星


25

首先...我要祝大家圣诞快乐(对不起,如果您所在的时区迟到了一天,对不起)。

为了庆祝这一时刻,我们将绘制雪花。因为年份是201 5,圣诞节是2 月5日(对于大多数人来说),所以我们将绘制一个Penta薄片。五角形是由五边形组成的简单分形。以下是一些示例(从此处获取)在此处输入图片说明

每个Pentaflake都有一个n阶。0阶五角星只是一个五边形。对于其他所有n阶,五角大楼由5个前阶五角星组成,它们围绕前一个阶的6个五角星排列。例如,1级五角星由围绕中央五边形排列的5个五边形组成。

输入项

该命令n。除预定义变量外,可以任何方式给出。

输出量

n五角大楼订单的图像。必须至少为100px宽和100px长。它可以保存到文件,显示给用户或输出到STDOUT。不允许任何其他形式的输出。允许此挑战之前存在的所有图像格式。

获奖

作为codegolf,字节数最少的人获胜。


3
-1是因为雪花仅具有6倍的对称性!= D
瑕疵的

@flawr根据本文,只有约0.1%的雪花实际上具有6倍的对称性……或完全没有对称性。但是,那些具有对称性的雪花除了具有6倍对称性以外,还可以具有3倍对称性:P
TheNumberOne

4
好吧,本文只研究了不到所有雪花的0.1%的方法,而且,因为他们只研究了美国的雪花,所以这毫无意义。我敢打赌,公制雪花更加对称!(PS:美丽的图像!第167号雪花特别有趣!)(我刚刚注意到,公制雪花必须具有10倍的对称性。)
瑕疵的

1
只要使用上述方法之一输出就可以了。但是,n不能在脚本文件中预定义。您可以从中读取,从用户n那里进行STDIN提示,将其用作函数/逗号行参数...除了直接将其直接嵌入到代码中之外,基本上不需要其他任何内容。
TheNumberOne

1
不想为此+1,因为它有25 :(
The_Basset_Hound16'Jan

Answers:


14

Matlab,226

function P(M);function c(L,X,Y,O);hold on;F=.5+5^.5/2;a=2*pi*(1:5)/5;b=a(1)/2;C=F^(2*L);x=cos(a+O*b)/C;y=sin(a+O*b)/C;if L<M;c(L+1,X,Y,~O);for k=1:5;c(L+1,X+x(k),Y+y(k),O);end;else;fill(X+x*F, Y+y*F,'k');end;end;c(0,0,0,0);end

取消高尔夫:

function P(M);                
function c(L,X,Y,O);          %recursive function
hold on;
F=.5+5^.5/2;                  %golden ratio
a=2*pi*(1:5)/5;               %full circle divided in 5 parts (angles)
b=a(1)/2;
C=F^(2*L);
x=cos(a+O*b)/C;               %calculate the relative position ofnext iteration
y=sin(a+O*b)/C;
if L<M;                       %current recursion (L) < Maximum (M)? recurse
    c(L+1,X,Y,~O);            %call recursion for inner pentagon
    for k=1:5;
        c(L+1,X+x(k),Y+y(k),O)%call recursion for the outer pentagons
    end; 
else;                         %draw
    fill(X+x*F, Y+y*F,'k');  
end;
end;
c(0,0,0,0);
end

第五次迭代(渲染已经花费了相当长的时间)。

在此处输入图片说明

代码的微小改动(不幸的是更多的字节)导致这种美感=)

在此处输入图片说明

哦,还有一个:

在此处输入图片说明


感谢您为我指出了这个挑战,我去添加了另一个解决方案,希望您不要介意;)无论如何,我已经安全地离开了字节数,但我发现它太有趣了。
Andras Deak 2015年

7

Mathematica,200个字节

a=RotationTransform
b=Range
r@k_:={Re[t=I^(4k/5)],Im@t}
R@k_:=a[Pi,(r@k+r[k+1])/2]
Graphics@Nest[GeometricTransformation[#,ScalingTransform[{1,1}(Sqrt@5-3)/2]@*#&/@Append[R/@b@5,a@0]]&,Polygon[r/@b@5],#]&

最后一行是可以应用于整数的函数n

Mathematica函数名称很长。有人应该对它们进行熵编码,并从中产生新的语言。:)

适用于1

在此处输入图片说明

适用于2

在此处输入图片说明


6

MATLAB,235个 233 217字节

更新:@flawr的大量建议帮助我丢失了16个字节。由于只有这样才能使我击败骗子的解决方案,而且如果没有骗子的帮助,我将不会首先找到挑战,因此请考虑一下这是我们的共同意见:)

N=input('');f=2*pi/5;c=1.5+5^.5/2;g=0:f:6;p=[cos(g);sin(g)];R=[p(:,2),[-p(2,2);p(1,2)]];for n=1:N,t=p;q=[];for l=0:4,q=[q R^l*[c-1+t(1,:);t(2,:)]/c];end,p=[q -t/c];end,p=reshape(p',5,[],2);fill(p(:,:,1),p(:,:,2),'k');

这是另一种MATLAB解决方案,该解决方案基于迭代函数系统的原理。我最感兴趣的是开发算法本身,并且我对解决方案没有太多关注。当然还有改进的空间。(我考虑过使用的硬编码定点近似值c,但这并不好。)

非高尔夫版本:

N=input('');                                % read order from stdin

f=2*pi/5;                                   % angle of 5-fold rotation
c=1.5+5^.5/2;                               % scaling factor for contraction

g=0:f:6;
p=[cos(g);sin(g)];                          % starting pentagon, outer radius 1
R=[p(:,2),[-p(2,2);p(1,2)]];                % 2d rotation matrix with angle f

for n=1:N,                                  % iterate the points
    t=p;
    q=[];
    for l=0:4,
       q=[q R^l*[c-1+t(1,:);t(2,:)]/c];     % add contracted-rotated points
    end,
    p=[q -t/c];                             % add contracted middle block
end,

p=reshape(p',5,[],2);                 % reshape to 5x[]x2 matrix to separate pentagons
fill(p(:,:,1),p(:,:,2),'k');          % plot pentagons

的结果N=5(随后有一个axis equal off漂亮的结果,但我希望不要按字节计):

N = 5五片


1
我认为您可以使用R=[p(:,2),[-p(2,2);p(1,2)]];(并消除上一个R,C,S)来节省一些字节,并且可以使用q=[q R^l*[c-1+t(1,:);t(2,:)]/c]c=1.5+5^.5/2;
漏洞更严重的

@flawr显然你是对的:) 1.感谢旋转矩阵,2.感谢new q,我什至在其中也有一对不必要的括号... 3.感谢,但这是什么魔术? 4.由于解决方案现在比您原来的解决方案短,因此我认为这也是您提交的部分内容。
Andras Deak

6

Mathematica,124个字节

Mathematica Table从版本10:开始支持新语法Table[expr, n],该语法节省了另一个字节。 Table[expr, n]等同于Table[expr, {n}]

f@n_:=(p=E^Array[π.4I#&,5];Graphics@Map[Polygon,ReIm@Fold[{g,s}~Function~Join[.62(.62g#+#&/@s),{-.39g}],p,p~Table~n],{-3}])

该函数的核心是使用复数进行变换,然后将其转换为点ReIm

测试用例:

f[4]

在此处输入图片说明


1
π在UTF-8中占用两个字节,因此总共有125个字节。
2012rcampion

OMFG这是什么
DumpsterDoofus

3

Mathematica,199 196字节

彼得·里希特(Peter Richter)的回答有些发毛,这是我自己的一个。它在很大程度上依赖于图形功能,而较少依赖于数学和FP。内置的CirclePoints是10.1中的新增功能

c=CirclePoints;g=GeometricTransformation;
p@0=Polygon@c[{1,0},5];
p@n_:=GraphicsGroup@{
        p[n-1],
        g[
          p[n-1]~g~RotationTransform[Pi/5],
          TranslationTransform/@{GoldenRatio^(2n-1),n*Pi/5}~c~5
        ]
      };
f=Graphics@*p

编辑:感谢DumpsterDoofus的GoldenRatio


替换((1+Sqrt@5)/2)为可以节省3个字节GoldenRatio。同样在第二行中,我认为应该p@0=Polygon@c[{1,0},5];代替p@0=Polygon@cp[{1,0},5];。(顺便说一句,我实际上是Peter,我有两个个人资料,哈哈)。
DumpsterDoofus

是! 好决定。我也发现了错字,但忘了修复它。D'oh,
hYPotenuser 2015年

2

Mathematica,130个字节

r=Exp[Pi.4I Range@5]
p=1/GoldenRatio
f@0={r}
f@n_:=Join@@Outer[1##&,r,p(f[n-1]p+1),1]~Join~{-f[n-1]p^2}
Graphics@*Polygon@*ReIm@*f

我使用了与njpipeorgan的答案类似的技术(实际上我偷走了他的2Pi I/5 == Pi.4I把戏),但是实现为递归函数。

用法示例(%用于访问最后一行输出的匿名函数):

 %[5]

在此处输入图片说明

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.