花のグラフ小花


31

このカモミールの花を見てください:

きれいですね。さて、これが実際には一輪の花ではないと言ったらどうでしょうか?

多くの花(ヒマワリ、カモミール、ヒナギクなどを含む)は、実際には花の頭にある非常に小さな花(ヒマワリの黒い点)で構成されています。これらのミニチュアの花は小花と呼ばれ、非常に特別な方法で配置されます。

基本的に、花の頭上のn番目の小花の位置は次のとおりです(極座標)。

ここで、c = 1(137.508度=黄金角に注意してください。この正確な精度を使用する必要はありません。)

これにより、小花がフェルマーのらせんと呼ばれるらせん状に形成されます。小花の位置もフィボナッチ数に関係していますが、それはまた別の話です。

だから、ここに挑戦です。整数nを入力として、最初のn個の小花の位置を計算してプロットします。これはであるため、実際には、何らかのウィンドウにポイントを表示するか、または一般的な画像形式のデータとしてSTDOUTまたはファイルに出力する必要があります。それ以外は、この課題はかなり簡単です。それはなので、最短のコードが勝ちます。GL HF!

以下は、出力がどのように見えるかのサンプル画像です。


スパイラルを上下逆に描くことはできますか?
リルトシアスト

1
FWIWパイナップル、アガウジェ、松ぼっくりなど、多くの果物がこのパターンを示しています。果物は花から発達するので、これは驚くべきことではありません。興味深いことに、いくつかのサボテンのボディもこのパターンを表示します。私のお気に入りは、フラクタルロマネスコブロッコリーです:en.wikipedia.org/wiki/Romanesco_broccoli#/media/…–
user151841

1
カッコいい!ロマネスコブロッコリーを見たことがあります。彼らがどのようにそのフラクタルパターンを持っているかは本当にクールだと思います。たぶん私はそのことについての挑戦...作ることができます
spaghetto

回答:


21

TI-BASIC、34バイト

TI-83 + / 84 +シリーズの計算機用。

Input N
2πe^(-2sinh⁻¹(.5→θstep
AnsN→θmax
"√(θ→r₁
Polar                      ;Displays polar mode graphs to graph screen
Dot                        ;Prevents lines from connecting points
DispGraph                  ;Displays graph screen

これは、原点のドットを0番目のドットと見なします。

1バイトsinh⁻¹(トークンのおかげ2πe^(-2sinh⁻¹(.5で、ラジアン単位で黄金角を取得する簡単な方法です。これはe^(sinh⁻¹(.5、黄金比であるという事実に由来しています。

N = 50のスクリーンショットを次に示します。

(はい、それはTI-84 +の96x64モノクロディスプレイです。新しいカラー計算機は解像度がアップグレードされていますが、iPhoneのピクセルはまだ3.7%しかありません。)

座標表示なし

を押しTRACEて各ポイントをステップスルーします。

座標あり


5
TI-BASICは、極座標の自然な選択です。
コナーオブライエン

バイト数をどのように決定しましたか?34をはるかに超えるように見えます。事前にプログラムされたキーは、sinh⁻¹(説明を理解した場合は)表示されるように、1バイト以上としてカウントされます。
DavidC

@DavidCarraher TI-BASICはトークン化されています。これらのトークンはすべて、計算機のメモリ内でそれぞれ1バイトです。
リルトシアスト

1
Mem(2nd-> +)-> 7に移動すると、プログラムのバイト数を確認できます。計算機上のすべてのプログラムのリストとそれらが占有するバイト数が表示されます。すべてのTI-BASICプログラムには、9バイトのヘッダー+名前のバイト数があるため、適切なバイト数を得るには、これらを必ず減算してください。
spaghetto

構文エラー-2sinh ^ -1に
username.ak

15

Python 2、85 82 81バイト

from pylab import*
for i in arange(0,input(),2.39996):polar(i,sqrt(i),'o')
show()

marinusによって1バイト短縮されました。

ラジアン単位の黄金角を使用します。代わりに137.508を使用した場合のバイト長は同じですが、どういうわけか見栄えがよくありません。pylabを使用して極座標プロットを生成します。以下は、300(古いバージョンの場合)が入力で、7000(新しいバージョンの場合)が入力である場合です。角度を最大2.4に丸めて、バイト数を77に減らすことができます。

入力が300の場合の古いバージョン

入力が7000の場合の新しいバージョン

以下は、グリッドと軸を削除することでよりきれいな外観を生成する長いバージョンです。

from pylab import *
def florets(n):
    for i in arange(0, n, 2.39996):polar(i, sqrt(i), 'o')
    grid(0)#turn off grid
    xticks([])#turn off angle axis
    yticks([])#turn off radius axis
    show()

色が異なる理由は、各ポイントが個別にプロットされ、独自のデータセットとして扱われるためです。角度と半径がリストとして渡された場合、それらは1つのセットとして扱われ、1つの色になります。


1
これは、これまでで最も美しい答えだと思います。中央にはっきりとしたらせんパターンが見えるのはとてもクールです。
エレンディアスターマン

forリスト内包表記の代わりに通常のループを使用して、バイトを節約できます。それは独自の行にある必要が;あり\nますが、同じ長さなので、それは問題ではありません。すなわち:from pylab import*- for i in arange(0,input(),2.39996):polar(i,sqrt(i),'o')-show()
マリナス

@marinusしかし、それはもはや超クールなワンライナーではありません!しかし、おかげで、私はそれを追加しました
ステータス

14

Blitz 2D / 3D、102バイト

(このサイトでの史上初のBlitz 2D / 3D回答!)

Graphics 180,180
Origin 90,90
n=Input()
For i=1To n
t#=i*137.508
r#=Sqr(t)
Plot r*Cos(t),r*Sin(t)
Next

の入力は50ウィンドウを塗りつぶします。(はい、そうすることで2バイト削ることができますGraphics 99,99が、視覚的には面白くも便利でもありません。)

50小花

よりきれいなバージョン(そしてよりうまく終了します):

Graphics 400,400
Origin 200,200

n=Input("How many florets? ")

For i = 1 To n
    t# = i * 137.508
    r# = Sqr(t)

    Oval r*Cos(t)-3,r*Sin(t)-3,7,7,1
Next

WaitKey
End

200小花の例


ねえ、きちんとした!これを読む前に電撃については知りませんでした。
ティモシーグルーテ

うわー、Blitz3Dは、いくつかの15年前に私の最初の言語だった:D ...ため息..: '(
noncom

デフォルトとしての学位?「おもしろい」...
リトシアスト

1
@noncom:それは私が本当に重要なプログラムを作った最初の言語でした。8年前。それは今でも私の最高の2つの言語のうちの1つです(もう1つはPythonです)。
エレンディアスターマン

1
@noncom、それも私の第一言語でした。今、プロとしてそれを使ってどう感じているのだろうか。
ジェームズウェブスター

12

Mathematica、43 42バイト

ListPolarPlot@Array[(2.39996#)^{1,.5}&,#]&

これは整数引数を取る名前のない関数です。例えば

ここに画像の説明を入力してください
スクリーンショットは古いバージョンを使用していますが、出力は同じように見えます。

MathematicaにはGoldenAngleさらに正確な結果を得るためのビルトインがありますが、それはよりも長い2.39996です


GoldenAngle!Mathematica 10.2の新しい関数ですか?
alephalpha

@alephalphaうん。
マーティンエンダー

11

MATLAB、42バイト

t=2.39996*(1:input(''));polar(t,t.^.5,'.')

入力番号を取得し、1からその番号までの範囲を作成します。

範囲にラジアン単位の黄金角を乗算します(使用される値は、137.508度から6平方フィートよりも真の値に近くなります)。

次に、ドットを使用して極座標チャートにthetarをプロットします。ここに2000ポイントが示されています

極地

少しきれいなグラフ(グリッド線なし)は次のコードになります。

t=2.39996*(1:input(''));[x,y]=pol2cart(t,t.^.5);plot(x,y,'.');axis equal

それは31バイトを犠牲にしているけれども。繰り返しますが、2000ポイントで示されています

プロット


私はpolar解決策が好きです、私は以前にそれを使ったことがありません。t.^.5instadを使用すると2バイト節約できると思いますsqrt(t)
flawr

@flawrありがとう。確かに2バイトが保存されました。
トムカーペンター

8

R、58 55 54バイト

x=2.39996*1:scan();plotrix::radial.plot(x^.5,x,rp="s")

これにはplotrixパッケージをインストールする必要がありますが、名前空間を明示的に参照しているため、パッケージをインポートする必要はありません。

ゴルフをしていない:

# Read a number of STDIN
n <- scan()

x <- 2.39996*(1:n)

# The rp.type = "s" option specifies that we want to plot points rather
# than lines (the default)
plotrix::radial.plot(lengths = sqrt(x), radial.pos = x, rp.type = "s")

n = 1500の出力例:

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

plannapusのおかげで3バイト節約できました!


8

R、55 54バイト

t=1:scan()*2.39996;r=t^.5;plot(r*cos(t),r*sin(t),as=1)

n = 1000の結果は次のとおりです。

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

編集:@AlexAのおかげasで、引数の部分一致(の代わりにasp)を使用して1バイトを保存しました。


6

R、48 47バイト

これはこれまでの他のRソリューションとは十分に異なると思います。これは、複雑なベクトルを使用して座標を構築します。tとtのsqrtはモジュラスと引数のパラメーターに入れられ、x、yは実数と虚数から取得されます。@AlexAに感謝します。バイト用。

plot(complex(,,,t^.5,t<-1:scan()*2.39996),as=1)

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


1
異なるだけでなく、短くなっています!+1。
エレンディアスターマン

関数パラメーターの部分一致を使用してバイトを保存できます:のas代わりに使用できますasp
アレックスA.

@AlexA。アレックスに感謝、私はそれらのものをテストするのを忘れ続けています:)
MickyT

3

Html + JavaScript 179

<canvas id=C></canvas><script>n=1500,C.width=C.height=400,T=C.getContext('2d');for(n=prompt(M=Math);n--;)r=M.sqrt(t=n*2.4)*9,T.fillRect(M.cos(t)*r+200,M.sin(t)*r+200,2,2)</script>


2

Jolf、25バイト

yG@@KyoΜzXDyOUH*Hm°yT'.}

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

(n = 5000の出力)

オンラインでお試しください。(結果のスパイラルは小さいことに注意してください)

Jolfはこのチャレンジの後に作成されて以来、競合していません。これは、ISO-8859-7でエンコードされた場合は25バイトであり、印刷不能なものが1つ含まれています(16進ダンプがあります)。

0000000: 7947 4096 404b 796f cc7a 5844 794f 5548  yG@.@Kyo.zXDyOUH
0000010: 2a48 6db0 7954 272e 7d                   *Hm.yT'.}

説明

yG@@KyoΜzXDyOUH*Hm°yT'.}
yG@@K                      goto (150,75) (center of the canvas)
     yo                    set current location as the origin
       MzX                 map over range 1...input
          D                start of function
           yO              goto polar coordinates ....
             UH            radius: square root of argument
               *Hm°        angle: argument times golden angle
                   yT'.    draw a dot there
                       }

2
まあ。奇妙なエンコーディングにも関わらず、今からJolfを調べる必要があると思います。
-lirtosiast


1

MATL、20バイト(非競合)

言語が課題を後回しにしているため、非競合としてマークされている

:2.4*tX^wJ*Ze*'.'&XG

MATL Online試しください

黄金角137.708deg = pi*(3-sqrt(5))rad = 2.39996...radはradとして近似され2.4ます。

次のバージョン(25バイト)は、double浮動小数点精度までの正確な値を使用します。

:YPI5X^-**tX^wJ*Ze*'.'&XG

MATL Online試しください


1

Tcl / Tk、114

grid [canvas .c]
proc P n {time {incr i
.c cr o [lmap h {cos sin cos sin} {expr sqrt($i*2.4)*$h\($i*2.4)+99}]} $n}

使用例:

P 1024

ウィンドウを出力します

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

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