Графік Квіткові квітки


31

Погляньте на цю квітку ромашки:

Гарненько, чи не так? Ну що робити, якби я сказав вам, що це насправді не одна квітка?

Багато квітів (включаючи соняшники, ромашки, жоржини та інші) насправді складаються з багатьох дуже маленьких квіток (чорних крапок на соняшниках) на квітковій голові. Ці мініатюрні квіти називають квітковими , і вони розташовані дуже особливим чином.

В основному, позиція n-ї квітки на голові квітки (у полярних координатах):

де c = 1 (зауважте, що 137.508 градусів = золотий кут. Вам не потрібно використовувати цю точну точність.)

Це змушує квіткові утворитися в спіралі під назвою Спіраль Ферма. Позиціонування квіток також пов'язане з числами Фібонначі, але це вже казка в інший час.

Отже, ось виклик. Задавши ціле число n як вхідне, обчисліть позиції перших n квіток і побудуйте їх . Це , тому я дійсно хочу, щоб ви показували точки у вікні якогось виду або виводилися у вигляді даних у загальному форматі зображення для STDOUT або у файлі. Крім цього, цей виклик повинен бути досить простим. Це , тому найкоротший код виграє. GLHF!

Ось зразкова картина того, як може виглядати вихід:


Чи дозволяється нам малювати спіраль догори дном?
lirtosiast

1
FWIW багато фруктів відображають цю схему, такі як ананас, агауе та шишка. Це не повинно дивувати, оскільки фрукти розвиваються з квітів. Цікаво, що деякі тіла кактусів також відображають цю картину. Моя улюблена фрактальна брокколі Romanesco: en.wikipedia.org/wiki/Romanesco_broccoli#/media/…
користувач151841

1
Круто! Я раніше бачив брокколі Романеско; Я думаю, що це дуже здорово, як вони мають той фрактальний малюнок. Можливо, я міг би зробити виклик з цього приводу ...
спагетто

Відповіді:


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-ю крапкою.

Завдяки однобайтовій sinh⁻¹(лексемі 2πe^(-2sinh⁻¹(.5короткий шлях отримання золотого кута в радіанах. Це випливає з того, що e^(sinh⁻¹(.5є золотим співвідношенням.

Ось скріншоти для N = 50.

(Так, це монохромний дисплей 96x64 на TI-84 +. Нові кольорові калькулятори мають оновлення роздільної здатності, але все ще мають лише 3,7% пікселів iPhone.)

Без відображення координат

Натисніть TRACEдля переходу до кожної точки.

З координатами


5
TI-BASIC - це природний вибір для полярних координат.
Conor O'Brien

Як Ви визначили кількість байтів? Схоже, що набагато більше 34. Попередньо запрограмований ключ, як sinh⁻¹здається (якби я зрозумів ваше пояснення), вважатиметься більш ніж одним байтом.
DavidC

@DavidCarraher TI-BASIC є токенізованим ; всі ці лексеми - це один байт у пам'яті калькулятора.
lirtosiast

1
Ви можете визначити кількість байтів у програмі, перейшовши до Mem (2nd -> +) -> 7. Потім ви побачите список усіх програм на своєму калькуляторі та кількість байтів, які вони займають. Зверніть увагу, що всі програми TI-BASIC мають 9-байтний заголовок + кількість байтів у імені, тому обов'язково віднімайте ті, щоб отримати належний підрахунок байтів.
спагетто

Помилка синтаксису на -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()

Скорочений на один байт мариною.

Використання золотого кута в радіанах. Довжина байтів однакова, якщо я замість цього використовував 137.508, але якимось чином не виглядає так добре. Породжує полярний сюжет за допомогою пілабу. Нижче, коли 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
Я думаю, що це найкраща відповідь на сьогоднішній день. Дуже круто бачити чіткі спіральні візерунки в центрі.
El'endia Starman

Ви можете зберегти байт, використовуючи звичайний forцикл замість розуміння списку. Він мав би бути по своїй лінії, але ;і \nмають однакову довжину, так що не має значення. Тобто: from pylab import*- for i in arange(0,input(),2.39996):polar(i,sqrt(i),'o')-show()
marinus

@marinus, але тоді це вже не переохолодження одного вкладиша! Але спасибі, я додав це.
Статус

14

Бліц 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заповнює вікно. (Так, я міг би поголити два байти 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: Це була перша мова, на якій я дійсно робив значні програми. Вісім років тому. Це все ще одна з моїх двох найкращих мов на сьогодні (інша - Python).
El'endia Starman

1
@noncom, це була і моя перша мова. Цікаво, як я відчував би це професійно зараз.
Джеймс Вебстер

12

Математика, 43 42 байти

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

Це неназвана функція, яка бере цілий аргумент, наприклад

введіть тут опис зображення
На екрані екрана використовується більш стара версія, але вихід виглядає однаково.

Mathematica насправді має вбудований GoldenAngleдля ще більш точних результатів, але це довше, ніж 2.39996.


GoldenAngle! Це нова функція в Mathematica 10.2?
алефальфа

@alephalpha Yep.
Мартін Ендер

11

MATLAB, 42 байти

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

Отримує номер введення, створює діапазон від 1 до цього числа.

Помножимо діапазон на золотий кут у радіанах (використовуване значення ближче до справжнього значення, ніж 137.508 градусів до 6 сф).

Потім просто побудуйте theta vs. r на діаграмі полярних координат, використовуючи крапки. Тут показано з 2000 балами

Полярний

Графік трохи гарнішого вигляду (без ліній сітки) буде таким кодом:

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

Хоча це за рахунок 31 байта. Знову це показано з 2000 очками

Сюжет


Мені подобається polarрішення, я ніколи цього не використовував. Я думаю, ви можете зберегти два байти, використовуючи t.^.5instad sqrt(t)!
flawr

@flawr Дякую Два байти дійсно збережено.
Том Карпентер

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:

введіть тут опис зображення

Збережено 3 байти завдяки планнапусу!


8

R, 55 54 байти

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

Ось результат для n = 1000:

введіть тут опис зображення

Редагувати: Збережено 1 байт, використовуючи часткове узгодження аргументів ( asзамість asp) завдяки @AlexA.!


6

R, 48 47 байт

Я думаю, що це досить відрізняється від інших R-рішень поки що. У цьому використовується складні вектори для побудови координат. sqrt t і t вводяться в параметри модуля і аргументу, а x, y беруть з реального і уявного. Завдяки @AlexA для байта.

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

введіть тут опис зображення


1
Мало того, що він різний, він і коротший! +1.
El'endia Starman

Ви можете зберегти байт, використовуючи часткове узгодження параметрів функції: asможе бути використаний замість asp.
Олексій А.

@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

Джольф, 25 байт

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

введіть тут опис зображення

(вихід для n = 5000)

Спробуйте в Інтернеті. (зауважте, що отримана спіраль невелика)

Неконкурентований, оскільки Джольф був створений після цього виклику. Це 25 байт при кодуванні з ISO-8859-7, і він містить один недрукований (ось шістнадцятковий):

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
Добре. Я думаю, що мені доведеться зараз заглянути в Джольфа, незважаючи на дивне кодування.
lirtosiast


1

MATL , 20 байт (не конкуруючий)

Позначено як неконкурентоспроможне, оскільки мова є викликом проблеми

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

Спробуйте в MATL Online!

Золотий кут, 137.708deg = pi*(3-sqrt(5))rad = 2.39996...rad апроксимується як 2.4rad.

У наступній версії ( 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

і виводить вікно

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.