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
漂亮的结果,但我希望不要按字节计):