一朵花的图小花


31

看看这朵洋甘菊花:

漂亮,不是吗?好吧,如果我告诉你这实际上不是一朵花怎么办?

实际上,许多花(包括向日葵,洋甘菊,雏菊和其他花朵)由许多很小的花(头上的黑点)组成。这些微型花称为小花,它们以非常特殊的方式排列。

基本上,第n个小花在头状花序上的位置是(在极坐标中):

其中c = 1(请注意137.508度=黄金角。您不必使用此精确度。)

这会使小花形成称为费马螺旋的螺旋状。小花的位置也与斐波那契数字有关,但这是另一个故事。

所以,这就是挑战。给定一个整数n作为输入,计算前n个小花的位置并绘制它们。这是,因此我实际上确实希望您在某种类型的窗口中显示这些点,或者将这些点以某种常见的图像格式作为数据输出到STDOUT或文件中。除此之外,这一挑战应该相当简单。这是,因此最短的代码获胜。GLHF!

这是输出的示例图片:


我们是否可以将螺旋状倒置?
lirtosiast 2015年

1
FWIW许多水果都显示出这种模式,例如菠萝,agauje和松果。这并不奇怪,因为水果是从花中发育出来的。有趣的是,一些仙人掌体也显示出这种模式。我最喜欢的是分形宝塔花菜:en.wikipedia.org/wiki/Romanesco_broccoli#/media/...
user151841

1
这很酷!我以前见过Romanesco西兰花;我认为它们具有这种分形图案真的很酷。也许我可以对此提出挑战……
意大利面条

Answers:


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的屏幕截图。

(是的,这是TI-84 +上的96x64单色显示器。较新的颜色计算器具有分辨率升级,但仍只有iPhone的3.7%像素。)

不显示坐标

TRACE逐步浏览每个点。

带座标


5
TI-BASIC是极坐标的自然选择。
Conor O'Brien 2015年

您如何确定字节数?看起来要比34多得多。一个预编程的密钥sinh⁻¹(如果我理解您的解释)将算作一个字节以上。
DavidC

@DavidCarraher TI-BASIC已标记化;所有这些令牌在计算器的内存中各为一个字节。
lirtosiast,2015年

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

marinus缩短了一个字节。

使用弧度的黄金角。如果我改用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,但是它不再是一种超酷的衬垫了!但感谢,我已经加了。
状态

14

Blitz 2D / 3D,102字节

(此网站上的第一个EVER 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朵小花的例子


嘿,整洁!在阅读本文之前,我不了解闪电战。
Timothy Groote 2015年

哇,Blitz3D是15年前我的第一门语言:D ...
sigh

度数为默认值?“有趣” ...
lirtosiast 2015年

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

@alephalpha是的。
Martin Ender

11

MATLAB,42个字节

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

获取输入数字,并创建从1到该数字的范围。

将范围乘以弧度的黄金角(所使用的值比137.508度到6 sf更接近真实值)。

然后只需使用点在极坐标图上绘制thetar的关系即可。这里显示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谢谢。确实保存了两个字节。
汤姆·卡彭特

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的示例输出:

在此处输入图片说明

感谢plannapus,节省了3个字节!


8

R,55 54字节

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

这是n = 1000的结果:

在此处输入图片说明

编辑:感谢@AlexA,使用参数的部分匹配(as而不是asp)节省了1个字节!


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
Alex A.

@AlexA。谢谢亚历克斯,我一直忘了测试那些:)
MickyT 2015年

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个字节

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

在此处输入图片说明

(n = 5000的输出)

在线尝试。(请注意,产生的螺旋很小)

自从Jolf在挑战之后创立以来就没有竞争。使用ISO-8859-7编码时,这是25个字节,并且包含一个不可打印的字符(这是一个十六进制转储):

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
好。尽管编码很奇怪,但我想我现在必须调查Jolf。
lirtosiast'2

1

Python 2,74个字节

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

1

MATL,20字节(非竞争)

标记为不竞争,因为语言推迟了挑战

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

MATL在线上尝试一下

黄金角137.708deg = pi*(3-sqrt(5))rad = 2.39996...rad近似为2.4rad。

以下版本(25个字节)使用精确值,直到double浮点精度:

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

MATL在线上尝试一下


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

并输出窗口

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.