Đồ thị hoa của một bông hoa


31

Hãy nhìn vào bông hoa cúc này:

Khá, phải không? Chà, nếu tôi nói với bạn rằng đây thực sự không phải là một bông hoa thì sao?

Rất nhiều hoa (bao gồm hoa hướng dương, hoa cúc, hoa cúc và những thứ khác) thực sự bao gồm nhiều bông hoa rất nhỏ (những chấm đen trên hoa hướng dương) trên đầu hoa. Những bông hoa thu nhỏ này được gọi là hoa , và chúng được sắp xếp theo một cách rất đặc biệt.

Về cơ bản, vị trí của hoa thứ n trên đầu hoa là (ở tọa độ cực):

trong đó c = 1 (Lưu ý rằng 137.508 độ = góc vàng. Bạn không phải sử dụng độ chính xác chính xác này.)

Điều này làm cho các bông hoa được hình thành trong một vòng xoắn ốc gọi là xoắn ốc Fermat. Vị trí của các bông hoa cũng được kết nối với các số Fibonnaci, nhưng đó là một câu chuyện cho một thời điểm khác.

Vì vậy, đây là thách thức. Cho một số nguyên n làm đầu vào, tính toán vị trí của n hoa con đầu tiên và vẽ đồ thị cho chúng . Đây là , vì vậy tôi thực sự muốn bạn hiển thị các điểm trong một cửa sổ thuộc loại nào đó hoặc xuất ra dưới dạng dữ liệu ở một số định dạng hình ảnh phổ biến thành STDOUT hoặc tệp. Ngoài ra, thách thức này nên khá đơn giản. Đó là , vì vậy đoạn mã ngắn nhất sẽ thắng. GLHF!

Dưới đây là hình ảnh mẫu về một đầu ra có thể trông như thế nào:


Chúng ta có được phép vẽ hình xoắn ốc lộn ngược không?
lirtosiast

1
FWIW nhiều loại trái cây hiển thị mô hình này, chẳng hạn như dứa, agauje và pinecone. Điều này không đáng ngạc nhiên vì trái cây phát triển từ hoa. Điều thú vị là một số thân xương rồng cũng hiển thị mô hình này. Yêu thích của tôi là bông cải xanh Romanesco: en.wikipedia.org/wiki/Romanesco_broccoli#/media/
Kẻ

1
Thật tuyệt! Tôi đã thấy bông cải xanh Romanesco trước đây; Tôi nghĩ thật tuyệt khi họ có mô hình fractal đó. Có lẽ tôi có thể đưa ra một thách thức về điều đó ...
một spaghetto

Câu trả lời:


21

TI-BASIC, 34 byte

Đối với loạt máy tính 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

Điều này coi dấu chấm ở điểm gốc là dấu chấm thứ 0.

Nhờ sinh⁻¹(mã thông báo một byte , 2πe^(-2sinh⁻¹(.5là một cách ngắn để có được góc vàng tính bằng radian. Điều này được bắt nguồn từ thực tế e^(sinh⁻¹(.5là tỷ lệ vàng.

Dưới đây là ảnh chụp màn hình cho N = 50.

(Có, đó là màn hình đơn sắc 96x64 trên TI-84 +. Máy tính màu mới hơn có nâng cấp độ phân giải, nhưng vẫn chỉ có 3,7% pixel của iPhone.)

Không có tọa độ hiển thị

Nhấn TRACEđể bước qua từng điểm.

Với tọa độ


5
TI-BASIC là một lựa chọn tự nhiên cho tọa độ cực.
Conor O'Brien

Làm thế nào bạn xác định số lượng byte? Có vẻ như nhiều hơn 34. Một khóa được lập trình sẵn, sinh⁻¹dường như là (nếu tôi hiểu lời giải thích của bạn), sẽ được tính là nhiều hơn một byte.
DavidC

@DavidCarraher TI-BASIC được mã hóa ; tất cả các mã thông báo này là một byte mỗi bộ nhớ trong máy tính.
lirtosiast

1
Bạn có thể xác định số lượng byte trong một chương trình bằng cách đi tới Mem (2nd -> +) -> 7. Sau đó, bạn sẽ thấy một danh sách tất cả các chương trình trên máy tính của bạn và số byte chúng chiếm. Lưu ý rằng tất cả các chương trình TI-BASIC có tiêu đề 9 byte + số byte trong tên, do đó hãy chắc chắn trừ đi những thứ đó để có được số byte thích hợp.
một spaghetto

Lỗi cú pháp trên -2sinh ^ -1
tên người

15

Python 2, 85 82 81 byte

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

Rút ngắn bằng một byte bởi bến.

Sử dụng góc vàng theo radian. Thay vào đó, độ dài byte là như nhau nếu tôi sử dụng 137.508 thay vào đó, nhưng bằng cách nào đó trông không tốt bằng. Tạo một âm mưu cực bằng cách sử dụng pylab. Dưới đây là khi 300 (đối với phiên bản cũ hơn) là đầu vào và 7000 (đối với phiên bản mới hơn) là đầu vào. Có thể làm tròn góc lên tới 2,4 để giảm số byte xuống 77.

Phiên bản cũ hơn khi đầu vào là 300

Phiên bản mới hơn khi đầu vào là 7000

Đây là phiên bản dài hơn tạo ra giao diện gọn gàng hơn bằng cách xóa lưới và trục:

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

Lý do cho các màu khác nhau là vì mỗi điểm được vẽ riêng và được coi là tập dữ liệu riêng của nó. Nếu các góc và bán kính được thông qua dưới dạng danh sách, thì chúng sẽ được coi là một bộ và có một màu.


1
Tôi nghĩ rằng đây là câu trả lời đẹp nhất cho đến nay. Thật tuyệt khi thấy các mô hình xoắn ốc rõ ràng ở trung tâm.
El'endia Starman

Bạn có thể lưu một byte bằng cách sử dụng một forvòng lặp thông thường thay vì hiểu danh sách. Nó muốn có được trên một dòng riêng, nhưng ;\nlà cùng độ dài, do đó không quan trọng. Tức là: from pylab import*- for i in arange(0,input(),2.39996):polar(i,sqrt(i),'o')-show()
bến

@marinus nhưng sau đó nó không còn là một siêu tàu! Nhưng cảm ơn, tôi đã thêm nó vào.
Trạng thái

14

Blitz 2D / 3D , 102 byte

(Câu trả lời 2D / 3D đầu tiên của EVER Blitz trên trang web này!)

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

Một đầu vào của 50điền vào cửa sổ. (Vâng, tôi có thể cạo hai byte bằng cách thực hiện Graphics 99,99, nhưng điều đó gần như không thú vị hoặc hữu ích về mặt trực quan.)

50 bông hoa

Phiên bản đẹp hơn (và thoát độc đáo hơn):

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

Ví dụ 200 hoa


này, gọn gàng! tôi đã không biết về blitz trước khi đọc nó.
Timothy Groote

Wow, Blitz3D là ngôn ngữ đầu tiên của tôi khoảng 15 năm trước: D ... thở dài ..: '(
noncom

Độ như mặc định? "Thú vị" ...
lirtosiast

1
@noncom: Đó là ngôn ngữ đầu tiên mà tôi thực sự tạo ra các chương trình quan trọng. Tám năm trước. Nó vẫn là một trong hai ngôn ngữ tốt nhất của tôi ngày nay (ngôn ngữ còn lại là Python).
El'endia Starman

1
@noncom, Đó cũng là ngôn ngữ đầu tiên của tôi. Tôi tự hỏi làm thế nào tôi cảm thấy sử dụng nó một cách chuyên nghiệp.
James Webster

12

Toán học, 43 42 byte

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

Đây là một hàm không tên lấy tham số nguyên, vd

nhập mô tả hình ảnh ở đây
Ảnh chụp màn hình sử dụng phiên bản cũ hơn, nhưng đầu ra trông giống nhau.

Mathematica thực sự có tích hợp sẵn GoldenAnglecho kết quả chính xác hơn, nhưng nó dài hơn 2.39996.


GoldenAngle! Đây có phải là một chức năng mới trong Mathicala 10.2?
alephalpha

@alephalpha Yep.
Martin Ender

11

MATLAB, 42 byte

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

Lấy số đầu vào, tạo một phạm vi từ 1 đến số đó.

Nhân phạm vi theo góc vàng tính bằng radian (giá trị được sử dụng gần với giá trị thực hơn 137,508 độ đến 6 sf).

Sau đó, chỉ cần vẽ theta so với r trên biểu đồ tọa độ cực bằng cách sử dụng dấu chấm. Ở đây hiển thị với 2000 điểm

Cực

Một biểu đồ trông đẹp hơn một chút (không có đường lưới) sẽ là mã này:

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

Mặc dù đó là chi phí của 31 byte. Một lần nữa ở đây là nó được hiển thị với 2000 điểm

Âm mưu


Tôi thích polargiải pháp này, tôi chưa bao giờ sử dụng giải pháp đó trước đây. Tôi nghĩ bạn có thể tiết kiệm hai byte bằng cách sử dụng t.^.5instad của sqrt(t)!
flawr

@flawr Cảm ơn. Hai byte thực sự được lưu.
Tom Carpenter

8

R, 58 55 54 byte

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

Điều này đòi hỏi plotrixgói phải được cài đặt, nhưng gói không phải nhập vì chúng tôi đang tham chiếu không gian tên một cách rõ ràng.

Ung dung:

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

Ví dụ đầu ra cho n = 1500:

nhập mô tả hình ảnh ở đây

Đã lưu 3 byte nhờ vào plannapus!


8

R, 55 54 byte

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

Đây là kết quả cho n = 1000:

nhập mô tả hình ảnh ở đây

Chỉnh sửa: Đã lưu 1 byte bằng cách sử dụng đối số một phần ( asthay vì asp) nhờ @AlexA.!


6

R, 48 47 byte

Tôi nghĩ rằng điều này là đủ khác biệt với các giải pháp R khác cho đến nay. Cái này sử dụng các vectơ phức tạp để xây dựng tọa độ. sqrt của t và t được đưa vào các tham số mô đun và đối số và x, y đang lấy từ thực và ảo. Cảm ơn @AlexA. cho byte.

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

nhập mô tả hình ảnh ở đây


1
Không chỉ khác biệt, nó còn ngắn hơn! +1.
El'endia Starman

Bạn có thể lưu một byte bằng cách sử dụng khớp một phần các tham số chức năng: ascó thể được sử dụng thay thế asp.
Alex A.

@AlexA. Cảm ơn Alex, tôi tiếp tục quên kiểm tra những cái đó :)
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 byte

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

nhập mô tả hình ảnh ở đây

(đầu ra cho n = 5000)

Hãy thử trực tuyến. (lưu ý rằng xoắn ốc kết quả là nhỏ)

Không cạnh tranh kể từ khi Jolf được tạo ra sau thử thách này. Đây là 25 byte khi được mã hóa bằng ISO-8859-7 và nó chứa một thứ không thể in được (đây là một hexdump):

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

Giải trình

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
Tốt. Tôi nghĩ bây giờ tôi sẽ phải xem xét Jolf, mặc dù có mã hóa lạ.
lirtosiast

1

Python 2, 74 byte

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

1

MATL , 20 byte (không cạnh tranh)

Được đánh dấu là không cạnh tranh vì ngôn ngữ hoãn thử thách

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

Hãy thử nó tại MATL Online!

Góc vàng, 137.708deg = pi*(3-sqrt(5))rad = 2.39996...rad xấp xỉ bằng 2.4rad.

Phiên bản sau ( 25 byte ) sử dụng giá trị chính xác, chính xác đến mức doublenổi:

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

Hãy thử nó tại 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}

Ví dụ về cách sử dụng:

P 1024

và xuất ra cửa sổ

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.