Bir Çiçeğin Grafik Florets


31

Bu papatya çiçeğine bir bakın:

Güzel değil mi? Peki ya bunun aslında bir çiçek olmadığını söyleseydim?

Bir çok çiçek (ayçiçeği, papatya, papatya ve diğerleri dahil) aslında bir çiçek başındaki çok küçük çiçeklerden (ayçiçeği üzerindeki siyah noktalar) oluşur. Bu minyatür çiçekler denir çiçeği ve onlar çok özel bir şekilde düzenlenmiştir.

Temel olarak, flor floretin bir çiçek başındaki konumu (kutupsal koordinatlarda):

c = 1 (137.508 derece = altın açı olduğunu unutmayın. Bu kesin hassasiyeti kullanmak zorunda değilsiniz.)

Bu, çiçeklerin Fermat's Spiral adlı bir spiralde oluşturulmasına neden olur. Çiçeklerin konumlandırılması da Fibonnaci sayıları ile bağlantılıdır, ancak bu başka bir zaman için bir hikayedir.

Yani, işte zorluk. Girdi olarak bir tamsayı n önüne alındığında, birinci n florets konumlarını hesaplamak ve bunları çizmek . Bu , bu yüzden noktaları bir tür pencerede göstermenizi veya bazı ortak görüntü formatlarında STDOUT'a veya bir dosyaya veri olarak almanızı istiyorum. Bunun dışında, bu zorluk oldukça basit olmalı. Bu var , böylece en kısa kod kazanır. GLHF!

Bir çıktının nasıl görünebileceğinin örnek bir resmi:


Spirali baş aşağı çekmemize izin var mı?
lirtosiast

1
FWIW birçok meyve ananas, agauje ve çam kozalağı gibi bu deseni gösterir. Meyveler çiçeklerden geliştiği için bu şaşırtıcı olmamalıdır. İlginç bir şekilde bazı kaktüs gövdeleri de bu düzeni gösterir. : Benim favori fraktal Romanesco brokoli olduğunu en.wikipedia.org/wiki/Romanesco_broccoli#/media/...
user151841

1
Çok havalı! Romanesco brokolisini daha önce gördüm; Bence bu fraktal yapıya sahip olmaları gerçekten harika. Belki bu konuda bir meydan okuma yapabilirim ...
bir

Yanıtlar:


21

TI-BASIC, 34 bayt

TI-83 + / 84 + serisi hesap makineleri için.

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

Bu, başlangıçtaki noktayı 0'ıncı nokta olarak kabul eder.

Bir baytlık sinh⁻¹(belirteç sayesinde, 2πe^(-2sinh⁻¹(.5altın açıyı radyan olarak almanın kısa bir yoludur. Bu e^(sinh⁻¹(.5altın oran olduğu gerçeğinden türemiştir .

İşte N = 50 için ekran görüntüleri.

(Evet, bu bir TI-84 + üzerindeki 96x64 monokrom ekran . Yeni renk hesap makinelerinin çözünürlüğü yükseltilmiş, ancak yine de bir iPhone'un piksellerini ancak 3.7% oranında alıyorlar.)

Görüntülenen koordinatlar olmadan

TRACEHer noktadan geçmek için tuşuna basın .

Koordinatlarla


5
TI-BASIC kutupsal koordinatlar için doğal bir seçimdir.
Conor O'Brien,

Bayt sayısını nasıl belirlediniz? 34'ten çok daha fazla görünüyor. Önceden programlanmış bir anahtar, sinh⁻¹göründüğü gibi (açıklamanızı anladıysam), birden fazla bayt olarak sayılır.
DavidC

@DavidCarraher TI-BASIC tokenize edildi ; Tüm bu jeton makinesini belleğinde her bayt biridir.
lirtosiast

1
Bir programdaki bayt sayısını, Mem (2. -> +) -> 7'ye giderek belirleyebilirsiniz. Daha sonra hesap makinenizdeki tüm programların bir listesini ve aldıkları bayt sayısını göreceksiniz. Tüm TI-BASIC programlarında 9 baytlık bir başlık + addaki bayt sayısının bulunduğunu unutmayın, bu nedenle uygun bayt sayısını elde etmek için bunları çıkardığınızdan emin olun.
bir

-2sinh ^ -1 üzerinde sözdizimi hatası
username.ak

15

Python 2, 85 82 81 bayt

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

Marinus tarafından bir byte kısaltılır.

Altın açının radyan cinsinden kullanılması. 137.508 yerine kullanırsam bayt uzunluğu aynıdır, ancak bir şekilde iyi görünmüyor. Pylab kullanarak bir kutup grafiği oluşturur. 300 (eski sürüm için) giriş, 7000 (yeni sürüm için) giriş ise aşağıdadır. Bayt sayısını 77'ye düşürmek için açı 2.4'e kadar yuvarlak olabilir.

Giriş 300 olduğunda eski sürüm

Giriş 7000 olduğunda daha yeni sürüm

Izgarayı ve ekseni kaldırarak daha temiz bir görünüm üreten daha uzun bir sürüm:

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

Farklı renklerin nedeni, her bir noktanın ayrı ayrı çizilmesi ve kendi veri seti olarak ele alınmasıdır. Eğer açılar ve yarıçaplar liste halinde geçildiyse, bunlar bir set olarak ele alınır ve bir renkte olurlar.


1
Bence bu şimdiye kadarki en güzel cevap. Merkezdeki açık sarmal desenleri görmek çok güzel.
El'endia Starman

forListe anlama yerine normal bir döngü kullanarak bir bayttan tasarruf edebilirsiniz . Bu kendi satırında olmak zorunda ederdim ama ;ve \no önemli değil bu yüzden, aynı uzunluktadır. Yani: from pylab import*- for i in arange(0,input(),2.39996):polar(i,sqrt(i),'o')-show()
marinus

@ marinus ama o zaman artık bir supercool bir liner! Ama teşekkürler, onu ekledim.
Durum

14

Blitz 2D / 3D , 102 bayt

(Bu sitede çok İLK EVER Blitz 2D / 3D cevap!)

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

Bir girdi 50pencereyi doldurur. (Evet, yaparak iki baytı tıraş edebilirim Graphics 99,99, ama bu neredeyse görsel olarak ilginç veya kullanışlı değil.)

50 çiçeği

Güzel sürüm (ve daha güzel çıkar):

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 çiçeği örneği


hey, temiz! Bunu okumadan önce yıldırım hakkında hiçbir şey bilmiyordum.
Timothy Groote

Vay be, Blitz3D 15 yıl önce ilk dilimdi: D ... sigh ..: '(
noncom

Varsayılan olarak derece mi? "İlginç" ...
lirtosiast

1
@noncom: Gerçekten de önemli programlar yaptığım ilk dildi. Sekiz yıl önce. Hala bugün en iyi iki dilimden biri (diğeri Python).
El'endia Starman

1
@noncom, Benim de ilk dilimdi. Şimdi profesyonelce nasıl kullanabileceğimi merak ediyorum.
James Webster,

12

Mathematica, 43 42 bayt

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

Bu bir tamsayı argümanı alan adsız bir fonksiyondur, örn.

görüntü tanımını buraya girin
Ekran görüntüsü daha eski bir sürüm kullanıyor, ancak çıktı aynı görünüyor.

Mathematica aslında GoldenAngledaha doğru sonuçlar için yerleşik bir yapıya sahip , ancak daha uzun 2.39996.


GoldenAngle! Mathematica 10.2'de yeni bir işlev midir?
alephalpha

@alephalpha Yep.
Martin Ender,

11

MATLAB, 42 bayt

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

Giriş numarasını alır, 1'den bu sayıya kadar bir aralık oluşturur.

Aralığı radyan cinsinden altın açıyla çarpar (kullanılan değer 137.508 derece ile 6 sf arasındaki gerçek değere daha yakındır).

Sonra basitçe çizer teta vs r noktalar kullanarak grafik kutupsal koordinatlarda. Burada 2000 puanla gösteriliyor

kutupsal

Biraz daha güzel görünen bir grafik (ızgara çizgileri yok) bu kod olacaktır:

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

Buna rağmen bu 31 bayt pahasına. Yine burada 2000 puanla gösteriliyor

Arsa


polarÇözümü sevdim, daha önce hiç kullanmadım. Sanırım iki bayt arasında t.^.5instad kullanarak tasarruf edebilirsiniz sqrt(t)!
kusur

@flawr Teşekkürler. İki bayt gerçekten kaydedildi.
Tom Carpenter,

8

R, 58 55 54 bayt

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

Bu, plotrixpaketin kurulmasını gerektirir , ancak ad alanına açıkça başvurduğumuz için paketin içe aktarılması gerekmez.

Ungolfed:

# 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 için örnek çıktı :

görüntü tanımını buraya girin

Plannapus sayesinde 3 bayt kurtarıldı!


8

R, 55 54 bayt

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

N = 1000 için sonuç şöyle:

görüntü tanımını buraya girin

Düzenleme: @AlexA sayesinde kısmi argüman eşleşmesini kullanarak ( asyerine asp) 1 bayt kaydedildi .!


6

R, 48 47 bayt

Bunun şu ana kadar diğer R çözümlerinden yeterince farklı olduğunu düşünüyorum. Bu, koordinatları oluşturmak için karmaşık vektörleri kullanır. t ve t'nin sqrt modülü ve argüman parametrelerine yerleştirilir ve x, y, gerçek ve hayali olandan alınır. @AlexA'ya teşekkürler. bayt için.

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

görüntü tanımını buraya girin


1
Sadece farklı değil, daha kısa! +1.
El'endia Starman

İşlev parametrelerinin kısmi eşleştirmesini kullanarak bir bayt kaydedebilirsiniz: asyerine kullanılabilir asp.
Alex A.

@AlexA. Teşekkürler Alex, ben bunları test etmeyi unutuyorum :)
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 bayt

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

görüntü tanımını buraya girin

(n = 5000 için çıktı)

Çevrimiçi deneyin. (Elde edilen sarmalın küçük olduğuna dikkat edin)

Jolf bu mücadeleden sonra yaratıldığından beri rekabet etmiyor. Bu, ISO-8859-7 ile kodlandığında 25 bayttır ve yazdırılamaz bir tane içerir (burada bir hexdump):

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

açıklama

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
İyi. Sanırım garip kodlamaya rağmen şimdi Jolf’a bakmam gerekecek.
lirtosiast

1

Python 2,74 bayt

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

1

MATL , 20 bayt ( rakipsiz )

Rekabete aykırı olarak işaretlendi çünkü dil mücadeleyi iptal ediyor

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

MATL Online'da deneyin !

Altın açı, 137.708deg = pi*(3-sqrt(5))rad = 2.39996...rad, rad olarak yaklaştırılır 2.4.

Aşağıdaki sürüm ( 25 bayt ) doublekayan nokta hassasiyetine kadar kesin değeri kullanır :

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

MATL Online'da deneyin !


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}

Kullanım örneği:

P 1024

ve pencereyi çıkarır

görüntü tanımını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.