กราฟดอกไม้


31

ดูดอกไม้ดอกคาโมไมล์นี้:

น่ารักใช่มั้ย ถ้าฉันบอกคุณว่านี่ไม่ใช่ดอกไม้ดอกเดียว

ดอกไม้จำนวนมาก (รวมถึงดอกทานตะวัน, ดอกคาโมไมล์, ดอกเดซี่และอื่น ๆ ) ประกอบด้วยดอกไม้เล็ก ๆ จำนวนมาก (จุดสีดำบนดอกทานตะวัน) บนหัวดอกไม้ ดอกไม้จิ๋วเหล่านี้เรียกว่าดอกย่อยและถูกจัดเรียงในแบบพิเศษมาก

โดยทั่วไปตำแหน่งที่ n ของดอกย่อยที่อยู่บนหัวดอกไม้คือ (ในพิกัดเชิงขั้ว):

โดยที่ c = 1 (โปรดสังเกตว่า 137.508 องศา = มุมสีทองคุณไม่จำเป็นต้องใช้ความแม่นยำที่แน่นอนนี้)

เรื่องนี้ทำให้เกิดดอกย่อยในเกลียวที่เรียกว่าเกลียวแฟร์มาต์ การวางตำแหน่งของดอกย่อยยังเชื่อมโยงกับหมายเลข Fibonnaci แต่นั่นเป็นเรื่องเล่าอีกครั้ง

ดังนั้นนี่คือความท้าทาย รับจำนวนเต็ม n เป็นอินพุตคำนวณตำแหน่งของดอกย่อยแรกและแปลงลงมา นี่คือดังนั้นจริง ๆ แล้วฉันต้องการให้คุณแสดงจุดในหน้าต่างเรียงลำดับหรือเอาท์พุทเป็นข้อมูลในรูปแบบภาพทั่วไปบางส่วนไปยัง STDOUT หรือไฟล์ นอกจากนั้นความท้าทายนี้ควรตรงไปตรงมาพอสมควร มันเป็นดังนั้นรหัสที่สั้นที่สุดจึงชนะ GLHF!

นี่คือภาพตัวอย่างของสิ่งที่การส่งออกอาจมีลักษณะ:


เราได้รับอนุญาตให้วาดเกลียวกลับหัวหรือไม่?
lirtosiast

1
FWIW ผลไม้หลายชนิดแสดงรูปแบบนี้เช่นสับปะรด agauje และ pinecone สิ่งนี้ไม่น่าแปลกใจเลยที่ผลไม้พัฒนาจากดอกไม้ ที่น่าสนใจบางอย่างของต้นกระบองเพชรก็แสดงแบบนี้ ที่ฉันชอบคือเศษส่วน Romanesco บรอกโคลี: en.wikipedia.org/wiki/Romanesco_broccoli#/media/...
user151841

1
เยี่ยมมาก! ฉันเคยเห็นบรอคโคลี่ Romanesco มาก่อน; ฉันคิดว่ามันยอดเยี่ยมจริง ๆ ว่าพวกเขามีรูปแบบเศษส่วนอย่างไร บางทีฉันอาจจะทำให้ความท้าทายเกี่ยวกับว่า ...
spaghetto

คำตอบ:


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-พื้นฐานคือtokenized ; โทเค็นเหล่านี้ทั้งหมดมีขนาดหนึ่งไบต์ในหน่วยความจำของเครื่องคิดเลข
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()

สั้นลงหนึ่งไบต์โดย 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

@marinus แต่แล้วมันก็ไม่ใช่ supercool one liner! แต่ขอบคุณฉันได้เพิ่มเข้าไปแล้ว
สถานะ

14

Blitz 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 florets


เฮ้เรียบร้อย! ฉันไม่รู้เรื่องสายฟ้าแลบก่อนที่จะอ่านสิ่งนี้
Timothy Groote

ว้าว Blitz3D เป็นภาษาแรกของฉันเมื่อ 15 ปีที่แล้ว: D ... ถอนหายใจ .. : '(
noncom

องศาเป็นค่าเริ่มต้นหรือไม่ "น่าสนใจ" ...
lirtosiast

1
@noncom: มันเป็นภาษาแรกที่ฉันทำรายการสำคัญ ๆ เมื่อแปดปีที่แล้ว มันยังคงเป็นหนึ่งในภาษาที่ดีที่สุดสองอันดับแรกของฉันในวันนี้
El'endia Starman

1
@noncom มันเป็นภาษาแรกของฉันเช่นกัน ฉันสงสัยว่าตอนนี้ฉันรู้สึกอย่างไรที่ใช้มันอย่างมืออาชีพ
James Webster

12

Mathematica, 43 42 ไบต์

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

นี่เป็นฟังก์ชั่นที่ไม่มีชื่อซึ่งใช้อาร์กิวเมนต์เป็นจำนวนเต็มเช่น

ป้อนคำอธิบายรูปภาพที่นี่
ภาพหน้าจอใช้เวอร์ชั่นที่เก่ากว่า แต่ผลลัพธ์จะเหมือนกัน

Mathematica จริงมีในตัวGoldenAngleเพื่อให้ได้ผลลัพธ์ที่ถูกต้องมากยิ่งขึ้น 2.39996แต่ที่นานกว่า


GoldenAngle! เป็นฟังก์ชันใหม่ใน Mathematica 10.2 หรือไม่
alephalpha

@alephalpha Yep
Martin Ender

11

MATLAB, 42 ไบต์

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

รับจำนวนอินพุตสร้างช่วงตั้งแต่ 1 ถึงหมายเลขนั้น

คูณช่วงด้วยมุมสีทองเป็นเรเดียน (ค่าที่ใช้ใกล้กับค่าจริงมากกว่า 137.508 องศาถึง 6 เอสเอฟ)

จากนั้นแปลงทีต้ากับrบนแผนภูมิพิกัดเชิงขั้วโดยใช้จุด แสดงที่นี่ด้วย 2,000 คะแนน

แถบขั้วโลก

กราฟที่ดูสวยกว่าเล็กน้อย (ไม่มีเส้นกริด) จะเป็นรหัสนี้:

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

แม้ว่านั่นจะเป็นค่าใช้จ่ายของ 31 ไบต์ อีกครั้งที่นี่คือมันแสดงด้วย 2,000 คะแนน

พล็อต


ฉันชอบpolarวิธีแก้ปัญหาฉันไม่เคยใช้วิธีนี้มาก่อน ฉันคิดว่าคุณสามารถบันทึกสองไบต์โดยใช้t.^.5instad of sqrt(t)!
ข้อบกพร่อง

@ flawr ขอบคุณ บันทึกสองไบต์แน่นอน
Tom Carpenter

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 ไบต์ขอบคุณ plannapus!


8

R, 55 54 ไบต์

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

นี่คือผลลัพธ์สำหรับ n = 1,000:

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข: บันทึก 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
Alex A.

@AlexA ขอขอบคุณอเล็กซ์ฉันให้ลืมที่จะทดสอบคนเหล่านั้น :)
MickyT


2

Jolf, 25 ไบต์

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

ป้อนคำอธิบายรูปภาพที่นี่

(เอาต์พุตสำหรับ n = 5,000)

ลองออนไลน์ (โปรดทราบว่าเกลียวที่เกิดขึ้นมีขนาดเล็ก)

ไม่ใช่การแข่งขันตั้งแต่ Jolf ถูกสร้างขึ้นหลังจากความท้าทายนี้ นี่คือ 25 ไบต์เมื่อเข้ารหัสด้วย ISO-8859-7 และมีหนึ่ง unprintable (นี่คือ 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
ดี. ฉันคิดว่าตอนนี้ฉันจะต้องมองหา Jolf แม้จะมีการเข้ารหัสที่แปลก
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

และส่งออกหน้าต่าง

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.