วงกลมผ่านจุดสามจุด


13

ให้พิกัดคาร์ทีเซียนสามจุดบนระนาบหาสมการของวงกลมผ่านพวกมันทั้งหมด จุดสามจุดจะไม่เป็นเส้นตรง

บรรทัดของการป้อนข้อมูลแต่ละโปรแกรมของคุณจะมีxและพิกัดของสามจุดในการสั่งซื้อy A(x),A(y),B(x),B(y),C(x),C(y)พิกัดเหล่านี้จะเป็นตัวเลขจริงน้อยกว่า 1,000,000 คั่นจากแต่ละช่องว่าง

(x-h)^2 + (y-k)^2 = r^2การแก้ปัญหาคือจะพิมพ์เป็นสมการที่มีรูปแบบ ค่าสำหรับh, k, rจะได้รับการพิมพ์ด้วยตัวเลขสามหลักหลังจุดทศนิยม เครื่องหมายบวกและลบในสมการควรมีการเปลี่ยนแปลงตามความจำเป็นเพื่อหลีกเลี่ยงสัญญาณหลาย ๆ ตัวต่อหน้าตัวเลข

Sample Inputs

7.0 -5.0 -1.0 1.0 0.0 -6.0
1.0 7.0 8.0 6.0 7.0 -2.0

Sample Outputs

(x - 3.000)^2 + (y + 2.000)^2 = 5.000^2
(x - 3.921)^2 + (y - 2.447)^2 = 5.409^2

เราสามารถใช้สมการขั้วโลกหรือพารามิเตอร์แทนได้หรือไม่?
Peter Olson

@peter ไม่ด้วยวิธีนี้จะเป็นการยากที่จะเปรียบเทียบกับคำตอบอื่น ๆ
fR0DDY

ควรมีเอาต์พุตอะไรในกรณีที่ไม่มีวิธีแก้ไขเฉพาะ? มีข้อ จำกัด อะไรบ้างเกี่ยวกับความทนทานของตัวเลข
Peter Taylor

@ peter-taylor มีการระบุไว้ในคำแถลงปัญหาว่า 'สามคะแนนจะไม่อยู่ในแนวเส้นตรง'
fR0DDY

2
จริงอยู่มันเป็นเพียงไม่กี่ตัวอักษรดังนั้นนี่ไม่ใช่คำโหยหาที่โซลูชันของฉันอาจสั้นกว่านี้เพียงคำถามที่ซื่อสัตย์ ... แต่ถ้าช่องว่างอยู่ในสเป็คเอาท์พุท มิฉะนั้นในรหัสกอล์ฟทำไมทุกคนจะได้พบกับสเป็คเอาท์พุท?
Rebecca Chernoff

คำตอบ:


6

Python 176 189 ตัวอักษร

import sys,re
for s in sys.stdin:x,y,z=eval(re.sub(r'(\S+) (\S+)',r'\1+\2j,',s));w=z-x;w/=y-x;c=(x-y)*(w-abs(w)**2)/2j/w.imag-x;print'(x%+.3f)^2+(y%+.3f)^2=%.3f^2'%(c.real,c.imag,abs(c+x))

ทำงานทั้งหมดในระนาบเชิงซ้อน ฉันไปคณิตศาสตร์จากด้านล่างของหน้านี้ -cเป็นศูนย์กลางของวงกลม


@ โจอี้: ใช่ฉันไม่ดี แก้ไขแล้ว.
Keith Randall

2

C # - 490

using System;class C{static void Main(){Func<string,double>p=s=>double.Parse(s);Func<double,string>t=s=>(s<0?"+ ":"- ")+Math.Abs(s).ToString("F3");foreach(var l in System.IO.File.ReadAllLines("i")){var v=l.Split();double a=p(v[0]),b=p(v[1]),c=p(v[2]),d=p(v[3]),e=p(v[4]),f=p(v[5]),m=(d-b)/(c-a),n=(f-d)/(e-c),x=(m*n*(b-f)+n*(a+c)-m*(c+e))/(2*(n-m)),y=-(x-(a+c)/2)/m+(b+d)/2,r=Math.Sqrt((x-a)*(x-a)+(y-b)*(y-b));Console.WriteLine("(x "+t(x)+")^2+(y "+t(y)+")^2 = "+r.ToString("F3")+"^2");}}}

พบว่ามี 2 บรรทัดระหว่าง AB และ BC จากนั้นจะพบว่าจุดตัดของเส้นสองเส้นเหล่านั้นตรงไหน (ซึ่งฉันเพิ่งสังเกตเห็นคือสิ่งที่ @PeterTaylor พูดถึงในความคิดเห็นของเขาต่อ @PeterOfTheCorn)


2

Ruby, 192 ตัวอักษร

$<.map{|l|a,b,c,d,e,f=l.split.map &:to_f
n=(f-d)/(e-c)
puts"(x%+.3f)^2+(y%+.3f)^2=%.3f^2"%[x=-(n*(a+c)+(n*(b-f)-(c+e))*m=(d-b)/(c-a))/2/n-=m,y=-(x+(a+c)/2)/m-(b+d)/2,((a+x)**2+(b+y)**2)**0.5]}

ตัวอย่างการใช้งาน:

$ echo "7.0 -5.0 -1.0 1.0 0.0 -6.0
1.0 7.0 8.0 6.0 7.0 -2.0" | ruby circle.rb
(x-3.000)^2+(y+2.000)^2=5.000^2
(x-3.921)^2+(y-2.447)^2=5.409^2

การจัดงานที่มอบหมายไปx, yและrในการเรียกร้องให้%จะช่วยถ้าเป็นไปได้
Lowjacker

@ โจอี้: ขอโทษเห็นได้ชัดว่าพลาดเมื่ออ่านคำถาม แก้ไขทันที
Ventero

1

Wolfram Alpha (27)

ฉันพูดว่าใช้เครื่องมือที่เหมาะสมสำหรับงาน

equation circle ([Input1],[Input2]),([Input3],[Input4]),([Input5],[Input6])

ตัวอย่างที่นี่


6
ไม่มีการจัดการอินพุต? ไม่รองรับอินพุตหลายบรรทัด? ฉันจะบอกว่านี่ไม่ผ่านการรับรอง
Joey

0

Javascript (299)

วิธีเดียวที่ฉันคิดได้ในการแก้ปัญหานี้คือการแก้สมการพีชคณิตสามสมการเพื่อหาสิ่งแปลกปลอมสามตัวเพื่อหา h, k และ r

p=prompt().split(' ');a=p[0],b=p[1],c=p[2],d=p[3],e=p[4],f=p[5];h=((a*a+b*b)*(f-d)+(c*c+d*d)*(b-f)+(e*e+f*f)*(d-b))/(a*(f-d)+c*(b-f)+e*(d-b))/2;k=((a*a+b*b)*(e-c)+(c*c+d*d)*(a-e)+(e*e+f*f)*(c-a))/(b*(e-c)+d*(a-e)+f*(c-a))/2;r=Math.sqrt((a-h)*(a-h)+(b-k)*(b-k));alert("(x-"+h+")²+(y-"+k+")²="+r+"²");

ตัวอย่าง I / O:

7.0 -5.0 -1.0 1.0 0.0 -6.0 -> (x-3)²+(y--2)²=5²

1.0 7.0 8.0 6.0 7.0 -2.0 -> (x-3.9210526315789473)²+(y-2.4473684210526314)² =5.409159155551175²

ข้อผิดพลาดเพียง แต่ที่ผมเห็นก็คือว่าถ้าชั่วโมงหรือ k เป็นลบมันจะออกผลลัพธ์แทน--+


2
มันสามารถทำได้ด้วยเข็มทิศและขอบตรง ใช้สองจุดลากเส้นที่แบ่งออกเป็นสองส่วน ใช้คู่ที่แตกต่างกันของสองคะแนนเหมือนกัน ค้นหาสี่แยก ไม่ว่าจะนำไปสู่รหัสที่สั้นลงฉันยังไม่ได้ตรวจสอบ
Peter Taylor

มันจัดการแค่อินพุตบรรทัดเดียวเท่านั้นใช่มั้ย
Joey

@ โจอี้ใช่ ปัญหาต้องการการจัดการหลายบรรทัดหรือไม่?
Peter Olson

1
การอ้างถึงภารกิจ: »แต่ละบรรทัดที่ป้อนเข้าสู่โปรแกรมของคุณจะมีพิกัด x และ y สามจุด ... «
Joey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.