तीन बिंदुओं के माध्यम से सर्कल


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, तीन अंकों के साथ मुद्रित किए जाने हैं। समीकरणों में प्लस और माइनस संकेतों को एक नंबर से पहले कई संकेतों से बचने के लिए आवश्यकतानुसार बदलना चाहिए।kr

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 नहीं। इस तरह से अन्य उत्तरों के साथ तुलना करना मुश्किल होगा।
fR0DDY

इस मामले में आउटपुट क्या होना चाहिए कि एक अनूठा समाधान नहीं है? संख्यात्मक मजबूती पर क्या अड़चनें हैं?
पीटर टेलर

@ पीटर-टेलर यह समस्या बयान में दी गई है कि 'तीन बिंदु एक सीधी रेखा पर नहीं होंगे।'
fR0DDY

2
दी, यह केवल कुछ अक्षर हैं, इसलिए यह एक शेख़ी नहीं है कि मेरा समाधान कुछ छोटा हो सकता है, बस एक ईमानदार सवाल ... लेकिन अगर व्हाट्सएप आउटपुट कल्पना में है, तो क्या यह अनिवार्य नहीं होना चाहिए? अन्यथा, एक कोड-गोल्फ में, कोई भी आउटपुट कल्पना क्यों पूरा करेगा?
रेबेका चेरनॉफ

जवाबों:


6

अजगर, 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चक्र का केंद्र है।


@ जोये: हाँ, मेरा बुरा। फिक्स्ड।
कीथ रान्डेल

2

सी # - 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");}}}

यह AB और BC के बीच की 2 लाइनों को खोजता है। फिर यह पता चलता है कि उन 2 लाइनों के द्वंद्व कहाँ हैं। (जो मैंने अभी देखा है @PeterTaylor ने @PeterOfTheCorn पर अपनी टिप्पणी में उल्लेख किया है।)


2

रूबी, 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कॉल में करने के लिए %मदद करनी चाहिए, यदि संभव हो तो।
लोजैकर

@ जोए: क्षमा करें, जाहिरा तौर पर याद किया जब सवाल पढ़ रहा था। अब निश्चित कर दिया।
वेंटरो

1

वोल्फ्राम अल्फा (27)

मैं कहता हूं, नौकरी के लिए उचित उपकरण का उपयोग करें।

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

यहाँ उदाहरण है


6
कोई इनपुट हैंडलिंग नहीं? इनपुट के कई लाइनों के लिए कोई समर्थन नहीं? मैं कहूंगा कि यह योग्य नहीं है।
जॉय

0

जावास्क्रिप्ट (299)

एकमात्र तरीका जो मैं इसे हल करने के बारे में सोच सकता था, वह है बी, एच और के को खोजने के लिए तीन अज्ञात के लिए तीन समीकरणों को हल करना।

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²

एकमात्र बग जो मुझे दिखाई देता है वह यह है कि यदि h या k ऋणात्मक है, तो --इसके बजाय यह आउटपुट होता है +


2
यह कम्पास और सीधे किनारे के साथ किया जा सकता है। दो बिंदु लें, जो रेखा उन्हें आकर्षित करती है, उसे खींचे। दो बिंदुओं की एक अलग जोड़ी लें, डिट्टो। चौराहा खोजें। चाहे वह छोटे कोड की ओर जाता हो, मुझे अभी तक जांच करनी है।
पीटर टेलर

यह इनपुट की केवल एक पंक्ति को संभालता है, है ना?
जॉय

@ जोये, हाँ। क्या समस्या को कई लाइन हैंडलिंग की आवश्यकता है?
पीटर ओल्सन

1
कार्य से उद्धरण: »आपके कार्यक्रम में इनपुट की प्रत्येक पंक्ति में तीन बिंदुओं के x और y निर्देशांक होंगे ...«
जॉय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.