ペンタフレークを描く


25

まず第一に...みんなにメリークリスマスを願っています(もしあなたのタイムゾーンに遅れているならごめんなさい)。

この機会を祝うために、雪の結晶を描きます。年は201 5であり、クリスマスは2 5日(大部分の人)であるため、ペンタフレークを描画します。ペンタフレイクは、五角形で構成される単純なフラクタルです。以下にいくつかの例を示します(ここから引用)ここに画像の説明を入力してください

各ペンタフレークには次数nがあります。次数0のペンタフレークは、単純に五角形です。他のすべての注文nの場合、ペンタフレークは、前の注文の6番目のペンタフレークの周りに配置された前の注文の5つのペンタフレークで構成されます。たとえば、次数1のペンタフレークは、中央の五角形の周りに配置された5つの五角形で構成されています。

入力

注文n。これは、事前定義された変数以外の方法で指定できます。

出力

注文のnペンタフレイクの画像。少なくとも幅100ピクセル、長さ100ピクセルである必要があります。ファイルに保存したり、ユーザーに表示したり、に出力したりできますSTDOUT。他の形式の出力は許可されません。このチャレンジの前に存在するすべての画像形式が許可されます。

勝ち

codegolfとして、バイト数が最も少ない人が勝ちます。


3
-1雪片の対称性は6つしかないためです!= D
フレア

@flawr この記事によると実際に雪片の約1%しか6倍対称性を持たないか、または対称性がまったくありません。P:しかし、それらの雪の対称性は、6回対称性に加えて、3回対称性を持つことができていないこと
TheNumberOne

4
まあ、この記事では、すべての雪片の0.1%未満しか研究していません。とにかく、彼らはアメリカの雪片だけを研究したので、それは無意味です。メトリック雪片はもっと対称的だと思います!(PS:美しい画像!スノーフレーク#167は特に興味深い!)(メトリックスノーフレークは10倍の対称性を持たなければならないことに気付きました。)
flawr

1
上記の方法のいずれかを使用して出力する限り、問題ありません。ただし、nスクリプトファイルで事前定義することはできません。nから読みSTDIN、ユーザーからそれを促し、関数/カンマ行引数として受け取ります...基本的にあなたのコードに直接埋め込むことを除いてあなたが望むものは何でも。
TheNumberOne

1

回答:


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

5回目の反復(レンダリングにはすでにかなりの時間がかかりました)。

ここに画像の説明を入力してください

コードのわずかな変更(残念ながら、より多くのバイト)は、この美しさをもたらします=)

ここに画像の説明を入力してください

ああ、もう一つ:

ここに画像の説明を入力してください


この挑戦を指摘してくれてありがとう、私は別の解決策を追加しました、あなたが気にしないことを願っています;)私はあなたのバイト数から安全に離れています、とにかく、私は見逃すにはあまりにも興味深いことがわかりました。
アンドラスDeak

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バイトを失うのを助けました。これだけでflawrの解決策打ち勝つことができ、そもそもflawrの助けがなければ課題を見つけられなかったので、これを私たちの共同提出と考えてください:)

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

@flawr明らかにあなたは正しいです:) 1.回転行列に感謝しqます。 4.現在、ソリューションは元のソリューションよりも短いため、これも部分的には提出物であると考えています。
アンドラス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では2バイトを使用するため、合計125バイトになります。
-2012rcampion

この何であるかOMFG
DumpsterDoofus

3

Mathematica、199 196バイト

ピーター・リヒターの答えを髪の毛で削って、ここに私自身のものがあります。グラフィック機能に大きく依存し、数学や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

編集:GoldenRatioのDumpsterDoofusに感謝


あなたは置き換えることにより、3つのバイトを保存することができ((1+Sqrt@5)/2)GoldenRatio。また、2行目ではのp@0=Polygon@c[{1,0},5];代わりに使用する必要がありp@0=Polygon@cp[{1,0},5];ます。(ところで私は実際にピーターです、私は2つのプロファイルを持っています笑)。
DumpsterDoofus

はい!良い電話。私もタイプミスを見つけましたが、それを修正するのを忘れていました。D'oh、
hYPotenuser

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]

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.