Wykres Florets of a Flower


31

Spójrz na ten kwiat rumianku:

Ładne, prawda? A co, jeśli powiem ci, że to nie był właściwie jeden kwiat?

Wiele kwiatów (w tym słoneczniki, rumianki, stokrotki i inne) faktycznie składa się z wielu bardzo małych kwiatów (czarne kropki na słonecznikach) na główce kwiatu. Te miniaturowe kwiaty nazywane są różyczkami i są ułożone w bardzo szczególny sposób.

Zasadniczo pozycja n-tego floret na główce kwiatu to (we współrzędnych biegunowych):

gdzie c = 1 (Zauważ, że 137,508 stopni = złoty kąt. Nie musisz używać tej dokładnej precyzji.)

To powoduje, że różyczki formują się w spiralę zwaną spiralą Fermata. Rozmieszczenie kwiatów jest również związane z liczbami Fibonnaci, ale to opowieść na inny czas.

Oto wyzwanie. Biorąc pod uwagę liczbę całkowitą n jako dane wejściowe, obliczyć pozycje pierwszych n kwiatów i wykreślić je . Jest to , więc tak naprawdę chcę, abyś wyświetlał punkty w jakimś oknie lub wyświetlał jako dane w jakimś popularnym formacie obrazu do STDOUT lub pliku. Poza tym wyzwanie to powinno być dość proste. To gra w , więc wygrywa najkrótszy kod. GLHF!

Oto przykładowy obraz tego, jak mogłoby wyglądać wyjście:


Czy wolno nam narysować spiralę do góry nogami?
lirtosiast

1
FWIW wiele owoców wykazuje ten wzór, takich jak ananas, agauje i szyszka. Nie powinno to dziwić, ponieważ owoce rozwijają się z kwiatów. Co ciekawe, niektóre ciała kaktusów również wykazują ten wzór. Moim ulubionym jest fraktalny brokuł Romanesco: en.wikipedia.org/wiki/Romanesco_broccoli#/media/…
user151841

1
To super! Widziałem wcześniej brokuły Romanesco; Myślę, że to naprawdę fajne, jak mają ten wzór fraktalny. Może mógłbym podjąć wyzwanie w tej sprawie ...
spaghetto

Odpowiedzi:


21

TI-BASIC, 34 bajty

Dla serii kalkulatorów 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

Uważa to, że kropka na początku jest zerową kropką.

Dzięki jednobajtowemu sinh⁻¹(żetonowi 2πe^(-2sinh⁻¹(.5jest to krótki sposób na uzyskanie złotego kąta w radianach. Wynika to z faktu, że e^(sinh⁻¹(.5jest to złoty podział.

Oto zrzuty ekranu dla N = 50.

(Tak, to monochromatyczny wyświetlacz 96x64 na TI-84 +. Nowsze kalkulatory kolorów mają wyższą rozdzielczość, ale nadal mają tylko 3,7% pikseli iPhone'a.)

Bez wyświetlanych współrzędnych

Naciśnij, TRACEaby przejść przez każdy punkt.

Ze współrzędnymi


5
TI-BASIC to naturalny wybór współrzędnych biegunowych.
Conor O'Brien,

Jak określiłeś liczbę bajtów? Wygląda na znacznie więcej niż 34. Wstępnie zaprogramowany klucz, jak się sinh⁻¹wydaje (jeśli zrozumiałem twoje wyjaśnienie), liczyłby się jako więcej niż jeden bajt.
DavidC

@DavidCarraher TI-BASIC jest tokenizowany ; wszystkie te tokeny mają jeden bajt w pamięci kalkulatora.
lirtosiast

1
Możesz określić liczbę bajtów w programie, przechodząc do Mem (2nd -> +) -> 7. Zobaczysz wtedy listę wszystkich programów na twoim kalkulatorze i liczbę bajtów, które zajmą. Zauważ, że wszystkie programy TI-BASIC mają 9-bajtowy nagłówek + liczbę bajtów w nazwie, więc odejmij je, aby uzyskać odpowiednią liczbę bajtów.
spaghetto

Błąd składniowy -2sinh ^ -1
nazwa_użytkownika.ak

15

Python 2, 85 82 81 bajtów

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

Skrócone o jeden bajt przez marinus.

Używanie złotego kąta w radianach. Długość bajtu jest taka sama, jeśli zamiast tego użyłem 137.508, ale jakoś nie wygląda tak dobrze. Generuje wykres polarny przy użyciu pylab. Poniżej podano, kiedy 300 (dla starszej wersji) jest wejściem, a 7000 (dla nowszej wersji) jest wejściem. Można zaokrąglić kąt do 2,4, aby obniżyć liczbę bajtów do 77.

Starsza wersja, gdy wejście wynosi 300

Nowsza wersja, gdy wejście to 7000

Oto dłuższa wersja, która zapewnia czystszy wygląd poprzez usunięcie siatki i osi:

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

Przyczyną różnych kolorów jest to, że każdy punkt jest drukowany osobno i traktowany jako własny zestaw danych. Gdyby kąty i promienie były przekazywane jako listy, wówczas byłyby traktowane jako jeden zestaw i miałyby jeden kolor.


1
Myślę, że jak dotąd jest to najładniejsza odpowiedź. Bardzo fajnie jest widzieć wyraźne spiralne wzory na środku.
El'endia Starman

Możesz zapisać bajt, używając normalnej forpętli zamiast zrozumienia listy. Musiałby być na swojej linii, ale ;i mieć \ntaką samą długość, więc to nie ma znaczenia. To znaczy: from pylab import*- for i in arange(0,input(),2.39996):polar(i,sqrt(i),'o')-show()
marinus,

@marinus, ale to już nie jest supercool one liner! Ale dzięki, dodałem to.
Status

14

Blitz 2D / 3D , 102 bajty

(Bardzo PIERWSZA EVER Blitz odpowiedź 2D / 3D na tej stronie!)

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

Wpisanie 50wypełnia okno. (Tak, mógłbym zrobić dwa bajty Graphics 99,99, ale nie jest to tak interesujące wizualnie ani przydatne).

50 różyczek

Ładniejsza wersja (i ładniej wychodzi):

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

Przykład 200 kwiatów


hej, schludnie! Nie wiedziałem o Blitz przed przeczytaniem tego.
Timothy Groote,

Wow, Blitz3D był moim pierwszym językiem jakieś 15 lat temu: D ... westchnienie ..: '(
noncom

Stopnie jako domyślne? „Ciekawe” ...
lirtosiast

1
@noncom: To był pierwszy język, w którym naprawdę zrobiłem znaczące programy. Osiem lat temu. Jest to nadal jeden z moich dwóch najlepszych obecnie języków (drugim jest Python).
El'endia Starman

1
@noncom, to był także mój pierwszy język. Zastanawiam się, jak bym się teraz czuł profesjonalnie.
James Webster,

12

Mathematica, 43 42 bajty

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

Jest to nienazwana funkcja przyjmująca argument liczby całkowitej, np

wprowadź opis zdjęcia tutaj
Zrzut ekranu używa starszej wersji, ale wynik wygląda tak samo.

Mathematica ma wbudowane GoldenAnglejeszcze dokładniejsze wyniki, ale to dłużej niż 2.39996.


GoldenAngle! Czy to nowa funkcja w Mathematica 10.2?
alephalpha

@alephalpha Yep.
Martin Ender,

11

MATLAB, 42 bajty

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

Pobiera liczbę wejściową, tworzy zakres od 1 do tej liczby.

Mnoży zakres przez złoty kąt w radianach (zastosowana wartość jest bliższa rzeczywistej wartości niż 137,508 stopni do 6 sf).

Następnie po prostu wykreśl theta vs. r na mapie współrzędnych biegunowych za pomocą kropek. Tutaj pokazano 2000 punktów

Polarny

Nieco ładniej wyglądającym wykresem (bez linii siatki) byłby ten kod:

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

Jest to kosztem 31 bajtów. Ponownie tutaj pokazano 2000 punktów

Wątek


Podoba mi się to polarrozwiązanie, nigdy wcześniej go nie używałem. Myślę, że możesz zapisać dwa bajty za pomocą t.^.5instad sqrt(t)!
flawr

@flawr Thanks. Dwa bajty rzeczywiście zapisane.
Tom Carpenter,

8

R, 58 55 54 bajtów

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

Wymaga plotrixto zainstalowania pakietu, ale pakiet nie musi zostać zaimportowany, ponieważ wyraźnie odwołujemy się do przestrzeni nazw.

Nie golfowany:

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

Przykładowe dane wyjściowe dla n = 1500:

wprowadź opis zdjęcia tutaj

Zaoszczędź 3 bajty dzięki plannapusowi!


8

R 55 55 bajtów

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

Oto wynik dla n = 1000:

wprowadź opis zdjęcia tutaj

Edycja: Zapisano 1 bajt dzięki częściowemu dopasowaniu argumentów ( aszamiast asp) dzięki @AlexA.!


6

R, 48 47 bajtów

Myślę, że to wystarczająco różni się od innych dotychczasowych rozwiązań R. Ten wykorzystuje złożone wektory do budowy współrzędnych. sqrt t i t są wstawiane do modułu i parametrów argumentu, a x, y pobierają z rzeczywistego i urojonego. Dzięki @AlexA. dla bajtu.

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

wprowadź opis zdjęcia tutaj


1
Nie tylko jest inaczej, jest krótszy! +1.
El'endia Starman

Możesz zapisać bajt za pomocą częściowego dopasowania parametrów funkcji: asmożna go użyć zamiast asp.
Alex A.,

@AlexA. Dzięki Alex, ciągle zapominam testować te :)
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 bajtów

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

wprowadź opis zdjęcia tutaj

(wyjście dla n = 5000)

Wypróbuj online. (zauważ, że wynikowa spirala jest mała)

Nie konkuruje, ponieważ Jolf powstał po tym wyzwaniu. Jest to 25 bajtów, gdy jest zakodowany zgodnie z ISO-8859-7 i zawiera jeden niedrukowalny (tutaj zrzut heksowy):

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

Wyjaśnienie

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
Dobrze. Myślę, że muszę teraz zajrzeć do Jolfa, pomimo dziwnego kodowania.
lirtosiast

1

Python 2, 74 bajty

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

1

MATL , 20 bajtów (nie konkuruje)

Oznaczony jako niekonkurencyjny, ponieważ język jest późniejszy od wyzwania

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

Wypróbuj w MATL Online!

Złoty kąt, 137.708deg = pi*(3-sqrt(5))rad = 2.39996...rad jest aproksymowany jako 2.4rad.

Następująca wersja ( 25 bajtów ) używa dokładnej wartości, aż do doubleprecyzji zmiennoprzecinkowej:

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

Wypróbuj w 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}

Przykład użycia:

P 1024

i wyświetla okno

wprowadź opis zdjęcia tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.