Граф цветочки цветка


31

Взгляните на этот цветок ромашки:

Довольно, не правда ли? Что ж, если я скажу вам, что это был не один цветок?

Многие цветы (включая подсолнухи, ромашки, ромашки и другие) на самом деле состоят из множества очень маленьких цветов (черные точки на подсолнухах) на цветочной головке. Эти миниатюрные цветы называют цветочками , и они устроены по-особенному.

По сути, позиция n-го цветочка на головке цветка (в полярных координатах):

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

Это приводит к тому, что цветочки образуются в виде спирали, называемой спиралью Ферма. Расположение цветочков также связано с числами Фибоначчи, но это сказка для другого времени.

Итак, вот проблема. Учитывая целое число n в качестве входных данных, вычислите положения первых n цветочков и нанесите их на график . Это , поэтому я действительно хочу, чтобы вы отображали точки в каком-либо окне или выводили в виде данных в каком-то обычном формате изображения в STDOUT или файл. Помимо этого, этот вызов должен быть довольно простым. Это , поэтому выигрывает самый короткий код. GLHF!

Вот пример изображения того, как может выглядеть вывод:


Разрешено ли рисовать спираль вверх ногами?
lirtosiast

1
FWIW многие фрукты демонстрируют этот паттерн, такие как ананас, агаже ​​и шишка. Это не должно удивлять, так как фрукты развиваются из цветов. Интересно, что некоторые тела кактусов также отображают этот паттерн. Мой любимый фрактальный романеско: en.wikipedia.org/wiki/Romanesco_broccoli#/media/...
user151841

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 - естественный выбор для полярных координат.
Конор О'Брайен

Как вы определили количество байтов? Похоже, намного больше, чем 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, но как-то не так хорошо. Создает полярный график, используя 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
Я думаю, что это самый красивый ответ на сегодняшний день. Очень круто видеть четкие спиральные узоры в центре.
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 байта

(Самый первый ответ на блиц 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

Степени по умолчанию? "Интересно" ...
lirtosiast

1
@noncom: Это был первый язык, на котором я действительно делал важные программы. Восемь лет назад. Это по-прежнему один из двух моих лучших языков на сегодняшний день (другой - Python).
El'endia Starman

1
@noncom, это был мой первый язык тоже. Интересно, как бы я себя чувствовал, используя это профессионально сейчас.
Джеймс Вебстер

12

Mathematica, 43 42 байта

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

Это безымянная функция, принимающая целочисленный аргумент, например

введите описание изображения здесь
Скриншот использует более старую версию, но вывод выглядит так же.

Mathematica на самом деле имеет встроенную функцию GoldenAngleдля еще более точных результатов, но это дольше 2.39996.


GoldenAngle! Это новая функция в Mathematica 10.2?
алефальфа

@alephalpha Да.
Мартин Эндер

11

MATLAB, 42 байта

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

Получает входной номер, создает диапазон от 1 до этого числа.

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

Затем просто нанесите тета против r на диаграмме полярных координат, используя точки. Здесь показано с 2000 баллов

полярный

Немного более симпатичный график (без линий сетки) будет таким кодом:

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

Хотя это за счет 31 байта. Снова вот это показано с 2000 очков

участок


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

@flawr Спасибо. Два байта действительно сохранены.
Том Карпентер

8

R, 58 55 54 байта

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

Это требует установки plotrixпакета, но пакет не нужно импортировать, потому что мы явно ссылаемся на пространство имен.

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:

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

Сохранено 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 до сих пор. Этот использует сложные векторы для построения координат. квадраты 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, и он содержит один непечатаемый (вот hexdump):

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.708град = pi*(3-sqrt(5))рад = 2.39996...рад, аппроксимируется как 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

и выводит окно

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.