รวมการเชื่อมต่อจุดสุดยอด


14

สมมติว่าคุณมีจำนวนเต็มบวกN ขั้นแรกให้สร้างรูปหลายเหลี่ยมแบบปกติที่มีจุดยอดNโดยมีระยะห่างระหว่างจุดยอดที่อยู่ใกล้เคียงเป็น 1 จากนั้นเชื่อมต่อเส้นจากจุดสุดยอดทุกจุดไปยังจุดสุดยอดอื่น ๆ สุดท้ายคำนวณความยาวของบรรทัดทั้งหมดที่รวมเข้าด้วยกัน

ตัวอย่าง

รับอินพุตN = 6สร้างรูปหกเหลี่ยมที่มีเส้นเชื่อมทุกจุดยอดด้วยจุดยอดอื่น

หกเหลี่ยม

อย่างที่คุณเห็นมีเส้นขอบ 6 เส้น (ความยาว = 1), 3 เส้นที่มีความยาวเส้นขอบสองเท่า (ความยาว = 2) และอีก 6 เส้นที่เราใช้โดยทฤษฎีบทพีทาโกรัสสามารถคำนวณความยาวสำหรับ , ซึ่งเป็น

ถ้าเราเพิ่มความยาวของเส้นร่วมกันเราจะได้รับ(6 * 1) + (3 * 2) + (6 * 1.732) = 22.392

ข้อมูลเพิ่มเติม

เนื่องจากโครงสร้างที่มีจุดยอด 2 หรือน้อยกว่านั้นไม่ถือว่าเป็นรูปหลายเหลี่ยมเอาต์พุต 0 (หรือNaNเนื่องจากระยะห่างระหว่างจุดยอดเดียวไม่สมเหตุสมผล) สำหรับ N = 1 เนื่องจากจุดยอดเดียวไม่สามารถเชื่อมต่อกับจุดยอดอื่น ๆ และ 1 สำหรับ N = 2 เนื่องจากจุดยอดสองจุดเชื่อมต่อกันด้วยบรรทัดเดียว

อินพุต

จำนวนเต็ม N ในรูปแบบที่สมเหตุสมผล

เอาท์พุต

ความยาวของสายทั้งหมดสรุปร่วมกันที่ถูกต้องอย่างน้อย 3 stdoutตำแหน่งทศนิยมไม่ว่าจะเป็นฟังก์ชั่นการกลับมาหรือพิมพ์โดยตรงกับ

กฎระเบียบ

  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ในภาษาใดก็ได้จะเป็นผู้ชนะ

โชคดี!

กรณีทดสอบ

(Input) -> (Output)
1 -> 0 or NaN
2 -> 1
3 -> 3
5 -> 13.091
6 -> 22.392

1
เราจะต้องจัดการกับจริง1เหรอ? รายการปัจจุบันของฉันจะกลับมาnanมากกว่าศูนย์ตัวอย่างและจะต้องใช้ปลอกพิเศษสำหรับมัน
Jonathan Allan

1
@JanathanAllan ฉันคิดเกี่ยวกับมันหลังจากเห็นคำตอบของคุณแล้วnanก็ดีเหมือนกันเพราะระยะห่างระหว่างจุดสุดยอดเพียงจุดเดียวก็ไม่สมเหตุสมผลเลย
เอียนเอช

6
คุณควรอนุญาตให้มีข้อผิดพลาดถูกโยนเกินไปสำหรับn=1ฉันคิดว่า
Jonathan Allan

เป็นการยากที่จะบอกว่าทศนิยม 3 ตำแหน่งนั้นมีความแม่นยำเพียงใดโดยไม่มีข้อ จำกัด ด้านบนNเนื่องจากเอาต์พุตมีขนาดใหญ่ขึ้นและการลอยตัวจะแม่นยำน้อยลง
xnor

@ xnor ตราบใดที่มันมีความแม่นยำสูงถึง 3 ตำแหน่งทศนิยมสำหรับอินพุตที่เหมาะสมใด ๆNการปรับของมันคือผลลัพธ์ที่ได้แม่นยำน้อยกว่าสำหรับตัวเลขขนาดใหญ่
Ian H.

คำตอบ:


13

Python 3 (พร้อมsympy ) ,  61 60 58 54  48 ไบต์

-6 (อาจถึง -10 ถ้าเราไม่จำเป็นต้องจัดการn=1) ขอบคุณxnor (การลดความซับซ้อนของตรีโกณมิติเพิ่มเติมรวมถึงการตีกอล์ฟเพิ่มเติมเพื่อจัดการกับตัวเรือนขอบ 1 และบันทึกวงเล็บด้วยการย้ายfloatcast (ตอนนี้ไม่จำเป็น) )

หวังว่าจะเอาชนะได้หากไม่มีห้องสมุดบุคคลที่สามอยู่ใช่ไหม ใช่!! แต่ให้ได้สิ่งที่กลิ้ง ...

lambda n:1%n*n/2/(1-cos(pi/n))
from math import*

ลองออนไลน์!

วิธีนี้ใช้สูตรสำหรับผลรวมของความยาวหากรูปหลายเหลี่ยมถูกจารึกไว้ภายในวงกลมหน่วยn*cot(pi/2/n)/2และปรับผลลัพธ์ให้เป็นหนึ่งสำหรับความยาวด้านที่เป็นหนึ่งโดยหารด้วยบาปของความยาวสายsin(pi/n)นั้น

สูตรแรกที่ได้มาโดยพิจารณาจากn-1ความยาวของสายไฟเส้นทแยงมุมทั้งหมดที่เล็ดลอดออกมาจากมุมหนึ่งที่มีความยาวsin(pi/n)(อีกครั้ง) sin(2*pi/n), ... sin((n-1)pi/n), ผลรวมของนี่คือcot(pi/2/n)มีหลายnมุมที่เราคูณด้วยnแต่จากนั้นเราได้นับสายทั้งหมดสองเส้นดังนั้นเราหารสอง

ผลลัพธ์ที่n*cot(pi/2/n)/2/sin(pi/n)ได้นั้นง่ายขึ้นโดย xnor ถึงn/2/(1-cos(pi/n))(holding for n>1)

... สิ่งนี้ (ตราบเท่าที่ความถูกต้องเป็นที่ยอมรับ) ในขณะนี้ไม่จำเป็นต้องsympyผ่านmathโมดูลในตัว ( math.pi=3.141592653589793) อีกต่อไป


2
ใช่! บันทึกแล้ว 11 ไบต์ สูตรเด็ด!
J42161217

1
n/2/(1-cos(pi/n))ดูเหมือนว่าสูตรลดความยุ่งยากในการ
xnor

Good spot @xnor (ตราบใดที่เราเอาท์พุท0.25สำหรับn=1- แต่ปลอกพิเศษอาจจะสั้นเกินไปเช่นกัน ... )
Jonathan Allan

@JonathanAllan ฮะแปลกที่เป็นผลมาสำหรับ1/4 มันสามารถนำมาปะกับn=1 1%n*นอกจากนี้ parens สามารถบันทึกโดยการย้ายภายในfloat float(1-cos(pi/n))ฉันไม่ค่อยรู้เรื่องเท่าไรนัก แต่อาจมีวิธีคิดเลขคณิตในการบังคับลอย
xnor

@xnor ขอบคุณ! (ฉันควรสังเกตการfloatเคลื่อนไหว) sympy แสดงผลออกมา - เช่นn=6ไม่มีการร่ายในการแสดงออกด้วยการเป็นตัวแทน3.0/(-sqrt(3)/2 + 1)- อาจจะมีวิธีที่สั้นกว่า แต่ฉันยังไม่รู้
Jonathan Allan

7

Pythonขนาด 34 ไบต์

lambda n:1%n*n/abs(1-1j**(2/n))**2

ลองออนไลน์!

ใช้สูตรn/2/(1-cos(pi/n))ง่ายจากโจนาธานอัลลัน นีลบันทึก 10 1jไบต์โดยสังเกตว่างูใหญ่สามารถคำนวณรากของความสามัคคีเป็นอำนาจบางส่วนของ

งูใหญ่ได้โดยไม่ต้องนำเข้าไม่ได้ในตัวตรีโกณมิติฟังก์ชั่นหรือpi eเพื่อn=1ให้0มากกว่าที่0.25เราจะ1%n*เสริม

เวอร์ชันที่ยาวกว่าโดยใช้กำลังแบบธรรมชาติจำนวนเท่านั้น:

lambda n:1%n*n/abs(1-(1+1e-8j/n)**314159265)**2

ลองออนไลน์!


1
เด็ดเหมือนแตงกวา
Jonathan Allan

37 bytes:lambda n:1%n*n/(1-(1j**(2/n)).real)/2
Neil

@ Neil Wow, Python สามารถคำนวณรากแห่งความสามัคคีได้
xnor

นั่นเป็นเรื่องง่าย ฉันไม่รู้ว่าabs()จะทำอะไร
Neil

@Nil มันจะได้รับค่าสัมบูรณ์ดังนั้นจึงเป็นบรรทัดฐานคือระยะทางจากจุดกำเนิด
Jonathan Allan

6

MATL , 16 15 ไบต์

t:=ZF&-|Rst2)/s

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

นี้ใช้กระทำซึ่งนำ FFT (Fast แปลงฟูริเยร์) ฟังก์ชั่นและที่ถือกำเนิดท้าทาย 8 วัน

คำอธิบาย

รหัสใช้เคล็ดลับนี้ (ดัดแปลงเป็น MATL) เพื่อสร้างรากฐานของความสามัคคี สิ่งเหล่านี้ทำให้ตำแหน่งของจุดยอดเป็นตัวเลขที่ซับซ้อนยกเว้นว่าระยะห่างระหว่างจุดยอดติดต่อกันไม่ได้ถูกทำให้เป็นมาตรฐานในการแก้ปัญหานั้นหลังจากคำนวณระยะทางตามจำนวนทั้งหมดแล้วโปรแกรมจะแบ่งพวกมันด้วยระยะห่างระหว่างจุดยอดต่อเนื่อง

t       % Implicit input, n. Duplicate
:       % Range: [1 2 ... n-1 n]
=       % Isequal, element-wise. Gives [0 0 ... 0 1]
ZF      % FFT. Gives the n complex n-th roots of unity
&-|     % Matrix of pairwise absolute differences
R       % Upper triangular matrix. This avoids counting each line twice.
s       % Sum of each column. The second entry gives the distance between
        % consecutive vertices
t2)/    % Divide all entries by the second entry
s       % Sum. Implicit display

1
นี่คือสิ่งที่สวยงาม
Jonah

@Jonah Complex หมายเลข FTW :-)
Luis Mendo

5

ตั๊กแตนโบราณ 25 (11 องค์ประกอบ 14 สาย)

ฉันอ่านเมตาโพสต์เกี่ยวกับโปรแกรมใน GH และ LabVIEW และทำตามคำแนะนำที่คล้ายกันเพื่อวัดภาษาภาพ

grasshopper program

พิมพ์<null>สำหรับ N = 0, 1, 2เนื่องจากPolygon Primitiveไม่สามารถสร้างรูปหลายเหลี่ยมที่มี 2 หรือน้อยกว่าและคุณจะได้รับรายการบรรทัดว่าง

ส่วนประกอบจากซ้ายไปขวา:

  • Side count ตัวเลื่อน: อินพุต
  • รูปหลายเหลี่ยมดั้งเดิม: วาดรูปหลายเหลี่ยมบนผืนผ้าใบ
  • Explode: ระเบิด polyline เป็น segements และ vertices
  • การอ้างอิงโยง: สร้างการอ้างอิงโยงแบบองค์รวมระหว่างจุดยอดทั้งหมด
  • เส้น: วาดเส้นระหว่างคู่ทั้งหมด
  • ลบบรรทัดที่ซ้ำกัน
  • ความยาวของโค้ง
  • (บน) รวม
  • (ด้านล่าง) ส่วน: เนื่องจากPolygon Primitiveวาดรูปหลายเหลี่ยมตามรัศมีเราจำเป็นต้องปรับขนาดรูปร่าง
  • Multipication
  • แผงควบคุม: เอาต์พุต

rhino screenshot



2

Haskell , 27 ไบต์

f 1=0
f n=n/2/(1-cos(pi/n))

ลองออนไลน์!

ฉันเพิ่งเข้าไปใน Haskell ดังนั้นนี่จึงเป็นกอล์ฟระดับเริ่มต้นที่ดี (นั่นคือการคัดลอกสูตรจากคำตอบอื่น ๆ )

ฉันพยายามอย่างหนักที่จะวาง$ที่ไหนสักแห่ง แต่คอมไพเลอร์ก็ตะโกนใส่ฉันดังนั้นนี่คือสิ่งที่ดีที่สุดที่ฉันมี : P


2

เยลลี่ , 13 12 11 ไบต์

ใช้สูตรของ Jonathan Allan (และต้องขอบคุณเขาที่ช่วยประหยัด 2 ไบต์)

ØP÷ÆẠCḤɓ’ȧ÷

ลองออนไลน์!

ฉันหลงใหลเยลลี่มาตลอด แต่ไม่ค่อยได้ใช้มันมากนักดังนั้นนี่อาจไม่ใช่รูปแบบที่ง่ายที่สุด


บันทึกไบต์โดยใช้ "การแลกเปลี่ยนการแยกห่วงโซ่ dyadic" ɓเพื่อเชื่อมโยงผู้ช่วยของคุณเช่น:ØP÷ÆẠCḤɓn1×÷
Jonathan Allan

@JanathanAllan โอ้ขอบคุณฉันยังเป็นผู้เริ่มต้นและรู้ว่าอาจมีวิธีที่ดีกว่าการมีห่วงโซ่ใหม่ แต่ไม่รู้ว่าจะทำอย่างไร
Jeffmagma

โอ้เราสามารถช่วยอีกคนได้โดยใช้การลดลงและลอจิคัล - และȧ: ØP÷ÆẠCḤɓ’ȧ÷:)
Jonathan Allan

โอ้ว้าวขอบคุณฉันไม่ได้คิดอย่างนั้น
Jeffmagma

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