シェルピンスキーの矢じり曲線を描く


14

前書き

シェルピンスキーアローヘッドカーブの制限がシェルピンスキーの三角形であることを曲線です。

最初は次のように始まります。

 _
/ \

次に、各行が最初の行の回転バージョンに置き換えられます。

  _
 / \
 \ /
_/ \_

次:

     _
    / \
    \ /
   _/ \_
  /     \
  \_   _/
 _  \ /  _
/ \_/ \_/ \

シェルピンスキーアローヘッドカーブエボリューション

あなたのタスク

数値nを指定すると、Sierpinski Arrowhead Curveのn番目の反復を出力します。

0インデックスまたは1インデックスを選択できますが、回答で指定してください。

画像を生成するか、上記の形式でAscii Artを使用できます。

この曲線を生成するためにビルトインを使用することはできません。

これはであるため、バイト数が最も少ないコードが優先されることに注意してください。

回答:


14

オクターブ、240の236 221バイト

これはここで使用したのと同じアイデアで作成されましたが、sierpinskyの矢じり曲線に合うように変更する必要がありました。

m=input(0);g=2*pi/6;u=cos(g);v=sin(g);A=[1,0];B=[u,v];C=[-u,v];D=-A;E=-B;F=-C;for k=1:m;f=[E;F;A];b=[A;B;C];A=[B;A;F];d=[C;D;E];C=[D;C;B];E=[F;E;D];B=b;D=d;F=f;end;A=[0,0;cumsum(A)];plot(A(:,1),A(:,2));axis off;axis equal

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


u=.5;v=3^u/2;B=[u,v];C=[-u,v];A=C<0;16バイト短くなります:) axis off equalさらに5バイト節約することもできます。
スチューイーグリフィン

3

Haskell +図、176バイト

import Diagrams.Prelude
import Diagrams.Backend.SVG
g n=renderSVG"a"(mkWidth 99).strokeT.a n
a 0=hrule 1
a n|b<-a(n-1)=b%6<>b<>b%(-6);a%n=rotateBy(1/n).reflectY$a::Trail V2 Double

「a」という透明な背景を持つsvgファイルを作成します。

g 0水平ライン出力、g 1です/¯\

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


素晴らしい、私は知らなかったDiagrams
flawr

@flawr、それは素晴らしいことですが、通常のHaskellグラフィカルプログラムの警告が適用されます。と同等のものを呼び出すだけでplot() ウィンドウが開くのは素晴らしいことです。
アンズ

2

MSWLogo(バージョン6.5b)、102バイト

ここshapeLshapeR指定さた2つの関数を取り、:a否定のときに反対の関数を呼び出す追加の引数を追加することでそれらをマージします。

to s :n :a :l
if :n=0[fd :l stop]
rt :a
s :n-1(-:a):l
lt :a
s :n-1 :a :l
lt :a
s :n-1(-:a):l
rt :a
end

s反復回数:n(1ベース)、角度:a、長さをとる関数が定義されています:l。これは再帰的であり、:a2つのインスタンスで角度を無効にして自身の下位反復を呼び出して、正しい方向を取得します。

  • rt :alt :aタートル(パスがトレースされる三角形のモノ)を右、左に回転させ:aます。
  • fd :l亀を:lステップごとに前進させます。

この関数は:a、60に等しい値で呼び出されます。

矢じり

これrepeatは、本質的には組み込みのcounterを備えたFORループrepcountです。「ペンアップ」と「ペンダウン」pupd意味しsetxyます。これらは、を使用して位置を設定している間、カメの描画を停止します。

各反復の図面は、に:l等しい長さで呼び出されpower 2 (7-repcount)、指数関数的に減少します。これは、定義:lが再帰的なステップで同じものを使用するためです。したがって、fixed :lでは、出力の全体的なサイズがで指数関数的に増加し:nます。


これは仕事にふさわしい言語ですが、技術的に答えには余分なデータは許可されないため、理想的には答えに60をエンコードします。
ニール

@Neilだから60、バイトカウントに含めるだけですか?
u54112

こんなに簡単かどうかはわかりませんが、自分で言語を知りません。
ニール

1

Python 2、124バイト

ウィキペディアの記事のコードに基づいています。

from turtle import*
def c(o,a):
 if o:o-=1;c(o,-a);lt(a);c(o,a);lt(a);c(o,-a)
 else:fd(9)
n=input()
if n%2==0:lt(60)
c(n,60)

次数0は直線です。


60度の角度を使用するには、コードを変更する必要があります。変更しないと、シェルピンスキーの三角形に近似しません。また、方向によって方向が変わりますが、これは正しいとは思いません。trinket.io/python/a803546939
mbomb007

ロゴの答えは、角度をパラメーターとして取る関数も提供するので、大丈夫だと思います。オリエンテーションが進む限り、それは同じカーブで、回転されたままです。
-BookOwl

ただし、ロゴの答えは常に同じローテーションです。あなたのものは注文ごとに異なるローテーションであり、すべて同じではありません。これは大丈夫ではありません。質問に含まれている写真を見てください。
mbomb007

課題は、ローテーションが同じである必要があると言っているのはどこですか?
-BookOwl

1
数学の専攻は、限界が収束しなければならないことを教えてくれます。あなたのものはありません。
mbomb007


0

JavaScript(ES6)、180バイト

f=(n,d=0,r=n=>` `.repeat(n))=>n?f(--n,d=3-d%3).map(s=>r([l=s.length/2,0,1,~n&1][d]+l)+s+r([,1,0,~n&1][d]+l)).concat(f(n,d+1).map(s=>s+r(!(d%3))+a.shift(),a=f(n,d+2))):[`_/\\`[d%3]]
<input type=number min=1 oninput=o.textContent=f(this.value).join`\n`><pre id=o>

文字列の配列を返します。間隔を正しくすることが最も難しい部分でした!205バイトの純粋な文字列バージョン:

f=(n,d=0,r=n=>` `.repeat(n))=>n?f(--n,d=3-d%3).replace(/.+/g,s=>r([l=s.length/2,0,1,~n&1][d]+l)+s+r([,1,0,~n&1][d]+l))+`\n`+f(n,d+1).replace(/.+/g,s=>s+r(!(d%3))+a.shift(),a=f(n,d+2).split`\n`):`_/\\`[d%3]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.