コッホスノーフレークのグラフィカル表現


13

Kochスノーフレークを生成する

コッホスノーフレークは、nそれぞれの辺の中央に別の等辺点が追加される三角形です:http : //en.wikipedia.org/wiki/Koch_snowflake#Properties

すでに Koch Snowflakeチャレンジがありましたn=4。新しい課題はn1との間にあるコッホ雪片を描くこと10です。

ルール

雪片は、プログラムやファイルにハードコーディングされていない場合があります-プログラムで生成する必要があります。

プログラムはn、1〜10のすべてのサイズをサポートする必要があります。

サイドの数は、std-inを介してユーザーが入力する必要があります。

スノーフレークのグラフィック表現を画面に印刷する必要があります。

n1、2、3、および4に等しいKochスノーフレークのサンプル(わかりやすくするために緑の線のみを使用し、再現しません):

コッホ雪片

タイブレーカーが発生した場合、アップ投票数が最も多いプログラムが勝ちます(ポップコンテスト)。


「ピクセルを配置する場所を計算するために関数を使用する必要があります。プログラムにこの目的のための組み込み関数がない場合、スコアから実装コストを差し引くことができます。 」何ピクセル?
xnor 14年

@xnorもともとは、ピクセル/文字ごとにスノーフレークを描画する方法を計算するためのものでした(チャレンジはもともとASCIIアートチャレンジでもありました)。ほとんどの人はおそらく線を使用するだけなので、それを削除します。

いっぱいになったスノーフレークを描くことはできますか?
xnor 14年

もちろん。このコメントはもっと長くする必要があります。

を超えn=7て、コンピューター画面のスノーフレークに新しく追加された三角形を表示できません。ここで「ベストエフォート」は問題ありませんか?ピクセルベースのソリューションの最小解像度はありますか?
xnor 14年

回答:


7

Mathematica 72

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

n = 3

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

alephalphaをありがとう。


良くやった。2人のキャラクターでそれをゴルフしてください、そして、あなたは勝利を得ます!

@ Hosch250更新、ありがとうございます。
チャノッグ

AnglePathMathematica 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は、複素平面の正三角形の頂点を与えます。1つ目kronは、各ポイントが4回複製されたポイントのリストのコピーを作成するために使用されます。~~o4つのベクトルを取得する便利な方法です。次にdiff(P)、連続するポイントの各ペア間のベクトルを見つけます。このベクトルの倍数(0、1 / 3、(1 + e- iπ/ 3)/ 3、および2/3)が古いポイントのそれぞれに追加されます。


このコードがどのように機能するか、もう少し説明していただけますか?私はいくつかのMatlabを知っていたと思いましたが、これは...狂気ですか?=)
flawr

@flawrいくつかのメモを追加しましたが、それは役に立ちますか?
-feersum

どうもありがとうございました!私はそのストリング乱用のトリックを心に留めておくつもりです=)
flawr

9

T-SQL:686(フォーマットを除く)

SQL Server 2012+の場合。

これは決して競争相手にはなりませんが、T-SQLで実現できるかどうかを確認する必要がありました。最初の3つのエッジから開始し、各エッジを再帰的に処理して、各レベルで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でそのような魔法を実現できるとは思いもしませんでした!
ハリーマスタウプレイフェア

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には奇妙なパーサーがあるため、コードを少し変更する必要がありました。これはto、必要でありend、前に別の行とスペースで:ある必要がありますが、他方で:はオプションです。

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

ロゴをどのように実行しますか?
ベータ崩壊14年

@BetaDecay私はこれを使用しました:logo.twentygototen.orgですが、これが最初に見つかりました:calormen.com/jslogo USBLogoをインストールすることもできます
nutki

8

BBC BASIC、179

REV 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

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

REV 0

@xnorに対するOPの回答によると、雪片を埋めても大丈夫です。この回答は、xnorのコメントに触発されました。色はただの楽しみのためであり、それが構築される方法を示しています。三角形(この場合はマゼンタ)を取り、ベースの1/3の6つの三角形でオーバープロットします。

  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つの小さなコッホ雪片が残ります。ゴルフバージョンは単なる黒のシルエットになりますが、この画像も残しておきます。
レベルリバーセント14年

BBC BasicまたはBBC BASICと書いていますか?...私は後者のために行くが、それは正しいかどうかはわからない
ベータ崩壊

2
@BetaDecay BASICは、初心者向けの汎用/シンボリック命令コードの略称です。「標準」ビットは、非常に多くのバリエーションがあるため議論の余地があります。en.wikipedia.org/wiki/BASIC。BASICのほとんどの亜種は大文字のバージョンを好みますが、ウィキペディアのページによると、Visual Basicは小文字を好みます。出荷時のBBC BASICは大文字だったと思います。私はbbcbasic.co.uk/bbcwin/bbcwin.htmlのバージョンを使用しています。WebサイトおよびIDEでは大文字です。したがって、大文字バージョンの方が正しいと思います。しかし、私はそれがあまり重要ではないと思います。
レベルリバーセント14年

ああ、大丈夫、大文字バージョンを続けます
ベータ崩壊14年

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))])

涼しい。2行以内のコードで形状を見つける文字列ベースのアプローチが気に入っています!しかし"G">j、をチェックして、3バイトの節約に"Q"<j使用fd(9/b)することはできませんか?さらにif、たとえば("G">j)引数9/bを使用したステートメントの乗算を回避し、それらをすべて1行後ろに置くことができますfor。ああ!その後、組み合わせrtlt使用することもできます120*(...)-60*(...)
ファルコ14年

これは、Kochスノーフレークinput + 1をレンダリングするようです。1を入力すると、上の図のように三角形になります。

@Falko助けてくれてありがとう!
ベータ崩壊14年

@ hosch250編集
ベータ崩壊14年

現在は何も描画されず、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
  • 文字列から始めて、evalトリックを使用して、0000すべての文字と101 n時間を繰り返し結合します(@xnorに感謝します)。
  • 最終文字列のすべての文字について、文字の値(1または0)に基づいて右に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

ワイズFWOM YOUW Gwave ...

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を使用してテストしました。CCBI2.1のTURT(タートルグラフィックフィンガープリント)の実装によりI、画像がSVGファイルに「印刷」されます。command-argumentなしでこれをCCBIで実行--turt-line=PATHすると、デフォルトでCCBI_TURT.svgという名前のファイルとして出力されます。これは、利用可能なFungeインタープリターを使用して、「スノーフレークのグラフィカル表現を画面に印刷」するのに最も近い方法です。いつか、タートルのグラフィック表示を備えたより良い通訳が出てくるかもしれませんが、今のところ...
  • ハングせずにCCBIを実行するには、末尾に改行が必要です(これは文字カウントに含まれています)。私は当然知っている?

基本的に、これはスタックを一時的なLシステムの一種として使用し、その場でそれを拡張することで機能します。各パスで、スタックのトップ番号が次の場合:

  • -2、印刷して停止します。
  • -1、カメは反時計回りに60度回転します。
  • 0、時計回りに120度回転します。
  • 1、前方に移動します(ここでは15ピクセルずつですがf、最後の行のを変更することで変更できます)。
  • 2以上のいくつかの数値nは、スタック上でに展開されますn-1, -1, n-1, 0, n-1, -1, n-1

の場合n = 10、このプロセスには非常に長い時間がかかり(私のシステムでは数分)、TURTを使用してブラシのサイズを調整できないため、結果のSVGのサイズは約10MBで、ブラウザーで表示できません。適切なプラグインがあれば、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番目の投稿があることに対する感謝。
アンドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.