Grafik Kuntum Bunga

31

Lihatlah bunga chamomile ini:

Cantik, bukan? Nah, bagaimana jika saya katakan bahwa ini sebenarnya bukan satu bunga?

Banyak bunga (termasuk bunga matahari, chamomile, bunga aster dan lainnya) sebenarnya terdiri dari banyak bunga yang sangat kecil (titik-titik hitam pada bunga matahari) pada kepala bunga. Bunga mini ini disebut kuntum bunga , dan disusun dengan cara yang sangat istimewa.

Pada dasarnya, posisi floret ke-9 pada kepala bunga adalah (dalam koordinat kutub):

di mana c = 1 (Perhatikan bahwa 137.508 derajat = sudut emas. Anda tidak harus menggunakan presisi yang tepat ini.)

Ini menyebabkan kuntum terbentuk dalam bentuk spiral yang disebut Fermat's Spiral. Penentuan posisi kuntum juga terhubung dengan nomor Fibonnaci, tetapi itu adalah kisah untuk lain waktu.

Jadi, inilah tantangannya. Diberikan bilangan bulat n sebagai input, hitung posisi kuntum n pertama dan plot mereka . Ini adalah , jadi saya benar-benar ingin Anda menampilkan titik-titik di jendela atau semacam dikeluarkan sebagai data dalam beberapa format gambar umum untuk STDOUT atau file. Selain itu, tantangan ini harus cukup mudah. Ini , jadi kode terpendek menang. GLHF!

Berikut adalah contoh gambar dari apa yang mungkin terlihat seperti output:

sebuah spaghetto
sumber
Apakah kita diizinkan menggambar spiral secara terbalik?
lirtosiast
1
FWIW banyak buah menampilkan pola ini, seperti nanas, agauje, dan biji pinus. Ini seharusnya tidak mengejutkan karena buah berkembang dari bunga. Menariknya beberapa badan kaktus juga menampilkan pola ini. Favorit saya adalah fraktal brokoli Romanesco: en.wikipedia.org/wiki/Romanesco_broccoli#/media/…
user151841
1
Itu keren! Saya pernah melihat brokoli Romanesco sebelumnya; Saya pikir itu sangat keren bagaimana mereka memiliki pola fraktal itu. Mungkin saya bisa membuat tantangan tentang itu ...
spaghetto

Jawaban:

21

TI-BASIC, 34 byte

Untuk seri kalkulator 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

Ini menganggap titik pada titik asal sebagai titik 0.

Berkat sinh⁻¹(token satu byte , 2πe^(-2sinh⁻¹(.5merupakan cara singkat untuk mendapatkan sudut emas pada radian. Ini berasal dari fakta bahwa itu e^(sinh⁻¹(.5adalah rasio emas.

Ini adalah screenshot untuk N = 50.

(Ya, itu adalah tampilan monokrom 96x64 pada TI-84 +. Kalkulator warna yang lebih baru memiliki peningkatan resolusi, tetapi masih memiliki hanya 3,7% piksel dari iPhone.)

Tanpa koordinat ditampilkan

Tekan TRACEuntuk melangkah melewati setiap titik.

Dengan koordinat

lirtosiast
sumber
5
TI-BASIC adalah pilihan alami untuk koordinat kutub.
Conor O'Brien
Bagaimana Anda menentukan jumlah byte? Sepertinya lebih dari 34. Kunci yang sudah diprogram, seperti yang sinh⁻¹terlihat (jika saya mengerti penjelasan Anda), akan dihitung lebih dari satu byte.
DavidC
@DavidCarraher TI-BASIC adalah tokenized ; semua token ini masing-masing satu byte dalam memori kalkulator.
lirtosiast
1
Anda dapat menentukan jumlah byte dalam suatu program dengan masuk ke Mem (2nd -> +) -> 7. Anda kemudian akan melihat daftar semua program pada kalkulator Anda dan jumlah byte yang diambilnya. Perhatikan bahwa semua program TI-BASIC memiliki header 9 byte + jumlah byte dalam nama, jadi pastikan untuk mengurangi mereka untuk mendapatkan jumlah byte yang tepat.
spaghetto
Kesalahan sintaks pada -2sinh ^ -1
username.ak
15

Python 2, 85 82 81 byte

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

Disingkat satu byte oleh marinus.

Menggunakan sudut emas dalam radian. Panjang byte sama jika saya menggunakan 137.508 sebagai gantinya, tetapi entah bagaimana tidak terlihat bagus. Menghasilkan plot kutub menggunakan pylab. Di bawah ini adalah 300 (untuk versi yang lebih lama) adalah input dan 7000 (untuk versi yang lebih baru) adalah input. Bisa membulatkan sudut hingga 2,4 untuk menurunkan jumlah byte menjadi 77.

Versi lebih lama ketika input 300

Versi lebih baru ketika input 7000

Berikut versi yang lebih panjang yang menghasilkan tampilan yang lebih bersih dengan menghapus kisi dan sumbu:

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

Alasan untuk warna yang berbeda adalah karena setiap titik diplot secara terpisah dan diperlakukan sebagai set data sendiri. Jika sudut dan jari-jari dilewatkan sebagai daftar, maka mereka akan diperlakukan sebagai satu set dan satu warna.

Status
sumber
1
Saya pikir ini adalah jawaban tercantik sejauh ini. Sangat keren melihat pola spiral yang jelas di tengah.
El'endia Starman
Anda bisa menyimpan byte dengan menggunakan forloop normal alih-alih pemahaman daftar. Itu harus berada di jalurnya sendiri, tetapi ;dan \nmemiliki panjang yang sama, jadi itu tidak masalah. Yakni: from pylab import*- for i in arange(0,input(),2.39996):polar(i,sqrt(i),'o')-show()
marinus
@marinus tapi kemudian tidak lagi satu kapal supercool! Tapi terima kasih, saya telah menambahkannya.
Status
14

Blitz 2D / 3D , 102 byte

(Jawaban PERTAMA Blitz 2D / 3D di situs ini!)

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

Input 50mengisi jendela. (Ya, saya bisa mengurangi dua byte dengan melakukan Graphics 99,99, tapi itu tidak begitu menarik atau berguna secara visual.)

50 kuntum

Versi lebih cantik (dan keluar dengan lebih baik):

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 kuntum contoh

El'endia Starman
sumber
hai, rapi! Saya tidak tahu tentang blitz sebelum membaca ini.
Timothy Groote
Wow, Blitz3D adalah bahasa pertama saya sekitar 15 tahun yang lalu: D ...
huh
Derajat sebagai default? "Menarik" ...
lirtosiast
1
@noncom: Itu adalah bahasa pertama yang membuat program penting bagi saya. Delapan tahun yang lalu. Ini masih salah satu dari dua bahasa terbaik saya saat ini (yang lain adalah Python).
El'endia Starman
1
@ Noncom, Itu juga bahasa pertamaku. Saya bertanya-tanya bagaimana perasaan saya menggunakannya secara profesional sekarang.
James Webster
12

Mathematica, 43 42 byte

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

Ini adalah fungsi tanpa nama yang mengambil argumen integer, misalnya

masukkan deskripsi gambar di sini
Tangkapan layar menggunakan versi yang lebih lama, tetapi hasilnya terlihat sama.

Mathematica sebenarnya memiliki built-in GoldenAngleuntuk hasil yang lebih akurat, tetapi itu lebih lama dari itu 2.39996.

Martin Ender
sumber
GoldenAngle! Apakah ini fungsi baru di Mathematica 10.2?
alephalpha
@alephalpha Yap.
Martin Ender
11

MATLAB, 42 byte

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

Mendapat nomor input, membuat rentang dari 1 hingga angka itu.

Mengalikan rentang dengan sudut emas dalam radian (nilai yang digunakan lebih dekat dengan nilai sebenarnya dari 137,508 derajat menjadi 6 dtk).

Maka cukup plot plot theta vs r pada grafik koordinat kutub menggunakan titik. Di sini ditunjukkan dengan 2000 poin

Kutub

Grafik yang tampak lebih cantik (tanpa garis kisi) adalah kode ini:

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

Padahal itu dengan mengorbankan 31 byte. Lagi di sini ditunjukkan dengan 2000 poin

Merencanakan

Tom Carpenter
sumber
Saya suka polarsolusinya, saya belum pernah menggunakan yang sebelumnya. Saya pikir Anda dapat menyimpan dua byte dengan menggunakan t.^.5instad sqrt(t)!
flawr
@ flawr, terima kasih. Dua byte memang disimpan.
Tom Carpenter
8

R, 58 55 54 byte

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

Ini membutuhkan plotrixpaket untuk diinstal, tetapi paket tidak harus diimpor karena kami mereferensikan namespace secara eksplisit.

Tidak Disatukan:

# 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")

Contoh output untuk n = 1500:

masukkan deskripsi gambar di sini

Disimpan 3 byte berkat plannapus!

Alex A.
sumber
8

R, 55 54 byte

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

Ini adalah hasil untuk n = 1000:

masukkan deskripsi gambar di sini

Sunting: Disimpan 1 byte menggunakan pencocokan sebagian argumen ( asbukan asp) berkat @AlexA.!

plannapus
sumber
6

R, 48 47 byte

Saya pikir ini cukup berbeda dari solusi R lainnya sejauh ini. Yang ini menggunakan vektor kompleks untuk membangun koordinat. sqrt dari t dan t dimasukkan ke dalam parameter modulus dan argumen dan x, y mengambil dari yang nyata dan imajiner. Terima kasih kepada @AlexA. untuk byte.

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

masukkan deskripsi gambar di sini

MickyT
sumber
1
Tidak hanya berbeda, itu lebih pendek! +1.
El'endia Starman
Anda dapat menyimpan byte menggunakan pencocokan sebagian parameter fungsi: asdapat digunakan sebagai pengganti asp.
Alex A.
@AlexA. Terima kasih Alex, saya selalu lupa untuk menguji yang :)
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>

edc65
sumber
2

Jolf, 25 byte

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

masukkan deskripsi gambar di sini

(output untuk n = 5000)

Cobalah online. (perhatikan bahwa spiral yang dihasilkan kecil)

Non-bersaing sejak Jolf diciptakan setelah tantangan ini. Ini adalah 25 byte ketika dikodekan dengan ISO-8859-7, dan mengandung satu yang tidak patut dicetak (ini hexdump):

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

Penjelasan

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
                       }
sebuah spaghetto
sumber
2
Baik. Saya pikir saya harus melihat ke Jolf sekarang, meskipun ada pengkodean yang aneh.
lirtosiast
1

Python 2, 74 byte

from pylab import*
i=arange(1,input(),2.39996)
polar(i,sqrt(i),'o')
show()
William Stein
sumber
1

MATL , 20 byte (tidak bersaing)

Ditandai sebagai tidak bersaing karena bahasa memposting tantangan

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

Cobalah di MATL Online!

Sudut emas, 137.708deg = pi*(3-sqrt(5))rad = 2.39996...rad diperkirakan sebagai 2.4rad.

Versi berikut ( 25 byte ) menggunakan nilai yang tepat, hingga doublepresisi floating-point:

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

Cobalah di MATL Online!

Luis Mendo
sumber
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}

Contoh penggunaan:

P 1024

dan menampilkan jendela

masukkan deskripsi gambar di sini

sergiol
sumber