ゴルフフラワーオブライフ


19

ここでの課題は、選択した言語で正確に生命の花(ある人によれば神聖な幾何学的図形)を描くことです。

生命の花

このデザインは、中心がピッチ1の三角形グリッドに配置された半径1の円と部分円の配置と、それらを囲む半径3の大きな円で構成されています。

デザインは好きなように拡大縮小できますが、数学的に正しいからの最大誤差2%は許容されます。ラスターグラフィックスを使用する場合、これにより、小さな円の直径が少なくとも約100ピクセルに効果的に制限されます。

これはコードゴルフなので、最短のコード(バイト)が優先されます。


10
サイトへようこそ!あなたが知っているように、一般に、回答を受け入れる前にしばらく待つことをお勧めします。そうすれば、他のユーザーはコンテストを「オーバー」とは見なさず、より多くの参加と競争があります。
DJMcMayhem

2
「視覚的、認識可能、正確」は明確でも客観的でもありません。提出が客観的な有効性基準なしに有効であるかどうかを判断することは不可能です。メインサイトに投稿する前に、Sandboxを使用してチャレンジに関する潜在的な問題を解決することをお勧めします。
メゴ

「認識可能」のような抽象ルールに加えて、最小サイズを指定することをお勧めします。
マナトワーク

まだ誰もプラグインしていないので、新しいチャレンジがフィードバックを得るのを助けるように設計されたメタでサンドボックスがあります。あなたはここでそれを見つけることができます:meta.codegolf.stackexchange.com/questions/2140/...
tuskiomi

1
実際には、19のサークルだけではありません。エッジにもいくつかの円弧があります。(そのうちの6つは2π/ 3の角度をカバーし、12はπをカバーし、18はπ/ 6をカバーします)
マーティン・エンダー

回答:


23

Mathematicaの、177の 173 128 124 120バイト

c=Circle;Graphics@{{0,0}~c~3,Rotate[Table[If[-3<x-y<4,c[{√3x,-x+2y}/2,1,Pi/{6,2}]],{x,-3,2},{y,-4,2}],Pi/3#]&~Array~6}

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

主なアイデアは、次の6つのローテーションバージョンから結果を作成することです。

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

これは、2つのコーナーが切り取られた同一の円弧の長方形のテーブルです。せん断を削除し、各円の中心をで表す場合#、基本的にこのパターンで円を分散します。

####
#####
######
######
 #####
  ####

これらのエッジは-3 < x-y < 4、2Dインデックスに条件を課すことで切り取られ(値はx-y対角線に沿って一定であるため)、せん断はこれらの乗算xy探しているグリッドにまたがる非直交基底ベクトルによって行われます。

回転しないアークのこの特定の向きは、アークの両端が均等に分割Piされ、アークを次のように表現できるため、最短になりますPi/{6,2}(他のすべてのアークでは、分子にマイナス記号または整数を追加する必要があります)。


√3を使用して2文字と0バイトを節約し、数値エラーの原因を排除します。
ケリーロウダー

@KellyLowder良い点、修正。
マーティンエンダー

8

OpenSCAD、228バイト

$fn=99;module o(a=9){difference(){circle(a);circle(a-1);}}function x(n)=9*[sin(n*60),cos(n*60)];module q(g){for(i=[1:6])if(g>0){translate(x(i))union(){o();q(g-1);}}else{intersection(){translate(x(i))o();circle(9);}}}q(2);o(27);

以下は、誰かがパラメーターr(半径)とw(リングの幅)を設定できるバージョンです。

r=1;w=.1;$fn=99;module o(n){difference(){circle(n);circle(n-w);}}function x(n)=(r-w/2)*[sin(n*60),cos(n*60)];module q(g){for(i=[1:6])if(g>0){translate(x(i))union(){o(r);q(g-1);}}else{intersection(){translate(x(i))o(r);circle(r);}}}q(2);o(3*r-w);

このバージョンは、246文字です。
このコードの一部は技術的には不要ですが、写真のように見えます。


OpenSCAD.net(Firefox 47)でこのエラーが発生しています: Error: Error: Parse error on line 1: ...x(k))o();circle(9);};}}}q(2);o(27); -----------------------^ Expecting 'TOK_ID', '}', 'TOK_IF', '!', '#', '%', '*', got ';'
HyperNeutrino

@AlexL。Macで実際のOpenSCADクライアントを使用すると、このエラーは発生しません。しかし、クロームを使用してOpenSCAD.netでそのエラーを再現できましたが、残念です。それは彼らのサービスに関する問題だと思います。デスクトップアプリケーションを試してもらえますか?
ヘンリーウィルダーマス

1
デスクトップ版(Ubuntu 14.04 LTS)で作業しました。
ベンジャミンスペクター

1
コードにパターン};}があることに気付きました。どちらのバージョンでも文字を削る}}で安全に置き換えることができると思います。自分でテストし、機能しているように見えました。
ベンジャミン・スペクター

6

Mathematica 263バイト

@MartinEnderの投稿にはあまり競争力がありませんが、それでも私はこれを楽しんでいました。花びらにランダムウォークをさせます!花びらは、ランダムに選択されたエンドポイントの1つをランダムに60度回転して歩きます。花びらの回転端が大きな円盤の外側にあるかどうかをテストし、そうであれば、回転は逆になります。

c=Circle;a=√3;v={e=0{,},{0,2}};f=RandomChoice;Graphics@{e~c~6,Table[q=f@{1,2};t=f@{p=Pi/3,-p};r=RotationTransform[#,v[[q]]]&;v=r[If[r[t]@v[[-q]]∈e~Disk~6,t,-t]]@v;Translate[Rotate[{c[{1,a},2,p{4,5}],c[{1,-a},2,p{1,2}]},ArcTan@@(#-#2)&@@v,e],v[[2]]],{5^5}]}

これが、アニメーションに使用した後続のコードです。

Export[NotebookDirectory[]<>"flower.gif", Table[Graphics[Join[{c[e,6]},(List@@%)[[1,2,1;;n-1]],{Thick,Red,(List@@%)[[1,2,n]]}]],{n,1,3^4,1}]]

ランダムペタルウォーク

2次元のランダムウォークは最終的に原点に戻らなければならないことをどこかで読みました。数千ステップで大容量ディスクの充填が保証されるようです。


これは非常に良い考えですが、有限の反復回数では、花全体が満杯にならない可能性もゼロではありません。30個の花びらを描いたら、おそらく終了条件を追加する必要があります(実際に終了したかどうかを判断する最も簡単な方法のようです)。そうすれば、終了時に描画が行われ、終了しない確率はゼロになります。
マーティンエンダー

それとは別に、保存できるバイトはたくさんあります:Sqrt[3]is 3^.5です。e最初に使用するまで定義する必要はなく、このトリックを使用してバイトを保存することができますv={e=0{,},{0,2}}。あなたはまた、いくつかのような中置記法を使用することができるe~c~6e~Disk~6、とArcTan@@Subtract@@vと同等でなければなりませんArcTan@@(#-#2)&@@v
マーティンエンダー

インフィックスと√演算子を使用して、15バイトを削ります。@MartinEnderのヒントをありがとう。キャンセルされた/ 2と2 *を取り除きました。180枚の花びらがあるので、通常、4 ^ 4回の反復でディスクの約半分をカバーし、5 ^ 5回で仕事をします。9 ^ 9がディスクをカバーしない確率は、10 ^ 400,000のうち約1であり、2%のエラーよりもはるかに少ないため、無駄なバイトをチェックする価値はありません。
ケリーロウダー

3

JavaScript(ES6)/ SVG、299バイト

with(document){write(`<svg height=250 width=250><circle${b=` fill=none stroke=black `}cx=125 cy=125 r=120 />`);for(i=0;i<24;i++)write(`<path${b}d=M5,125${`${a=`a60,60,0,0,1,`}40,0`.repeat(i%4+3)+`${a}-40,0`.repeat(i%4+3)} transform=${`rotate(60,125,125)`.repeat(i>>2)}rotate(-60,${i%4*4}5,125) />`)}

さまざまな長さの複数のアークペアを生成し、それらを所定の位置に回転させることで機能します。

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