एक त्रिकोण के केंद्र


13

मंडलियों और वर्गों में एक एकल, निश्चित केंद्र बिंदु है। हालांकि, एक त्रिकोण के केंद्र की धारणा लंबे समय से चर्चा की गई है। चार अलग-अलग केंद्र प्राचीन यूनानियों के लिए जाने जाते थे:

  • इनकेंटर : त्रिभुज के कोण द्विभाजक का चौराहा
  • सेंट्रोइड : त्रिकोण के प्रत्येक शीर्ष से इसके विपरीत पक्ष के मध्य तक की रेखाओं का प्रतिच्छेदन
  • परिधि : पक्षों के लंबवत द्विभाजनों का प्रतिच्छेदन
  • ऑर्थोसेंटर : त्रिकोण के ऊंचाई का चौराहा

बाद में यूलर ने साबित किया कि किसी भी त्रिभुज में केन्द्रक, परिधि और ऑर्थोसेंटर का मिलन होता है। त्रिकोण में इन तीन बिंदुओं पर जो रेखा होती है, उसे यूलर रेखा कहते हैं । यह एक समबाहु त्रिभुज को छोड़कर प्रत्येक त्रिभुज के लिए परिभाषित किया जाता है, जहाँ सभी बिंदु संयोग करते हैं।

आपकी चुनौती सबसे छोटा प्रोग्राम या फ़ंक्शन बनाना है, जब दो इनपुट दिए जाते हैं, एक विशिष्ट केंद्र या त्रिकोण की यूलर लाइन को आउटपुट करता है। पहले एक त्रिकोण के प्रत्येक शीर्ष के निर्देशांक को निर्दिष्ट करता है। दूसरा 1 से 5 तक का पूर्णांक है, जो यह निर्धारित करता है कि आउटपुट क्या है।

1 - Incenter
2 - Centroid
3 - Circumcenter
4 - Orthocenter
5 - Equation of Euler Line
    (if the Euler Line is vertical, output the `x` value of the line
      (e.g. output `5` if the equation of the line is `x = 5`))

आप मान सकते हैं कि दिए गए कोने कभी भी आपस में नहीं मिलेंगे, और यह कि वे हमेशा पूर्णांक निर्देशांक होंगे (यह इनपुट के रूप में एक समबाहु त्रिभुज की संभावना को भी शामिल करता है, जैसा कि @ R.Kap की टिप्पणी के अनुसार )।

इनपुट सरणी आपकी भाषा में एक मान्य नेस्टेड सरणी होनी चाहिए, और इनपुट किसी भी उचित प्रारूप में होना चाहिए। किसी भी फ्लोट मान को कम से कम 3 दशमलव स्थानों पर प्रदर्शित किया जाना चाहिए, लेकिन कम नहीं। इनपुट प्रारूप के साथ मेल खाते हुए आउटपुट बिंदु आपकी भाषा में एक मान्य सरणी होनी चाहिए।


परीक्षण के मामलों:

Input: [(-2, 0), (1, 0), (0, 1)] 1
Output: (-0.089, 0.451)

Input: [(-2, 0), (1, 0), (0, 1)] 2
Output: (-0.333, 0.333)

Input: [(-2, 0), (1, 0), (0, 1)] 3
Output: (-0.5, -0.5)

Input: [(-2, 0), (1, 0), (0, 1)] 4
Output: (0, 2)

Input: [(-2, 0), (1, 0), (0, 1)] 5
Output: 5x + 2

स्पष्टता: इनपुट या तो स्टडिन से हो सकता है, या तो स्पेस या नई-लाइन अलग हो सकती है, या किसी फ़ंक्शन के तर्क के रूप में। हालाँकि, आउटपुट को stdout को लिखा जाना चाहिए।


1
मुझे डर है कि कार्तीय निर्देशांक में परिधि और ऑर्थोसेंटर के लिए स्पष्ट सूत्र बहुत बदसूरत हैं। अगर मैं एक सामान्य ट्रिलिनियर / बैरीसेंट्रिक => कार्थेसियन निर्देशांक बनाने का तरीका जाता हूं, तो इंसीनरेटर लगभग मुक्त हो जाता है। En.wikipedia.org/wiki/Trilinear_coordinates#Examples देखें । क्या मुझे इसे लागू करने के लिए अतिरिक्त अंक मिलेंगे?
जॉन ड्वोरक

यूलर लाइन के लिए वैध आउटपुट प्रारूप क्या हैं? यदि यह लंबवत है, तो इसे व्यक्त नहीं किया जा सकता है y=f(x)
जॉन ड्वोरक

1
(कृपया टिप्पणी करें यदि आप असहमत हैं) कृपया सैंडबॉक्स का उपयोग करें यदि आप सुनिश्चित नहीं हैं कि कोई चुनौती ठीक है या नहीं। वहां आप टिप्पणी मांग सकते हैं और सवाल को तब तक निखार सकते हैं जब तक वह फिट न हो जाए। एक बार यहां पोस्ट करने के बाद इसे सामग्री के संबंध में नहीं बदलना चाहिए। कई लोग पहले से ही इस पर काम कर सकते हैं - और बढ़ते लक्ष्य पसंद नहीं करते हैं।
हावर्ड

1
"जब एक बिंदु को आउटपुट करते हैं, तो निर्देशांक होना चाहिए ... गोल कोष्ठक (()) में घिरा हुआ है"। इसकी आवश्यकता क्यों? कुछ भाषाओं में, बिंदुओं को घुंघराले कोष्ठक में दर्शाया गया है। और जैसे कुछ (12, -2) को केवल एक स्ट्रिंग के रूप में दर्शाया जा सकता है, जिस स्थिति में तत्वों को संख्याओं के बजाय स्ट्रिंग के रूप में व्याख्या की जाती है।
डेविड

1
आप या तो यह बनाना चाहते हैं कि इनपुट फ़्लोटिंग पॉइंट निर्देशांक हो सकता है, या पूरी तरह से छुटकारा पा सकता है (if the triangle is equilateral, output the point at which the centers meet)क्योंकि केवल पूर्णांक निर्देशांक का उपयोग करके समतल विमान पर एक समभुज त्रिभुज बनाना संभव नहीं है।
आर। कप

जवाबों:


2

अजगर - 908 870

स्क्रॉलिंग को कम करने के लिए नई लाइनें जोड़ी गईं। यह शायद आगे गोल्फ हो सकता है।

from math import*;t=eval(input());p=int(input())-1;
r=[];A,B,C=t[0],t[1],t[2];
a,b,c=hypot(B[0]-C[0],B[1]-C[1]),hypot(A[0]-C[0],A[1]-C[1]),hypot(A[0]-B[0],A[1]-B[1]);
r.append(((a*A[0]+b*B[0]+c*C[0])/(a+b+c),(a*A[1]+b*B[1]+c*C[1])/(a+b+c)));
r.append(((A[0]+B[0]+C[0])/3,(A[1]+B[1]+C[1])/3));d,e,f=(0,0),(B[0]-A[0],B[1]-A[1]),(C[0]-A[0],C[1]-A[1]);g=2*(e[0]*f[1]-e[1]*f[0]);
r.append(((f[1]*(e[0]**2+e[1]**2)-e[1]*(f[0]**2+f[1]**2))/g+A[0],(e[0]*(f[0]**2+f[1]**2)- f[0]*(e[0]**2+e[1]**2))/g+A[1]));
h=acos((b*b+c*c-a*a)/(2*b*c));i=acos((a*a+c*c-b*b)/(2*a*c));j=acos((a*a+b*b- c*c)/(2*a*b));k=cos(i)*cos(j);
l=cos(h)*cos(j);m=cos(h)*cos(i);r.append(((a*k*A[0]+b*l*B[0]+c*m*C[0])/(a*k+b*l+c*m),(a*k*A[1]+b*l*B[1]+c*m*C[1])/(a*k+b*l+c*m)));
n,o=r[1][0]-r[2][0],r[1][1]-r[2][1];q=r[1][1]-o/n*r[1][0]if n!=0 else 0;
r.append(r[1]if a==b==c else("x="+str(r[1][0])if n==0 else"".join([str(o/n),"x+(",str(q),")"])));print(r[p])

टेस्ट केस (एनोटेट):

Input: [(-2, 0), (1, 0), (0, 1)]
1
Output: (-0.08907279243665268, 0.45110872103880023) --> More digits than in question

Input: [(-2, 0), (1, 0), (0, 1)]
2
Output: (-0.3333333333333333, 0.3333333333333333) --> More digits than in question

Input: [(-2, 0), (1, 0), (0, 1)]
3
Output: (-0.5, -0.5)

Input: [(-2, 0), (1, 0), (0, 1)]
4
Output: (-1.1702778228588997e-16, 1.9999999999999984) --> More digits than shown in question

Input: [(-2, 0), (1, 0), (0, 1)]
5
Output: 4.999999999999999x+(1.9999999999999996) --> More digits than in question

जैसा कि आप देख सकते हैं, फ्लोटिंग पॉइंट का उपयोग करने के कारण संभवतः त्रुटियां हैं।


आगे गोल्फिंग:

नीचे टिप्पणियों में सुझावों के आधार पर, मैं इसे छोटा करने में कामयाब रहा।

from math import*;I=input;t=eval(I());p=int(I())-1;r=[];A,B,C=t[0],t[1],t[2];R,H,D,S,T=r.append,hypot,cos,acos,str;a,b,c=H(B[0]-C[0],B[1]-C[1]),H(A[0]-C[0],A[1]-C[1]),H(A[0]-B[0],A[1]-B[1]);R(((a*A[0]+b*B[0]+c*C[0])/(a+b+c),(a*A[1]+b*B[1]+c*C[1])/(a+b+c)));R(((A[0]+B[0]+C[0])/3,(A[1]+B[1]+C[1])/3));d,e,f=(0,0),(B[0]-A[0],B[1]-A[1]),(C[0]-A[0],C[1]-A[1]);g=2*(e[0]*f[1]-e[1]*f[0]);R(((f[1]*(e[0]**2+e[1]**2)-e[1]*(f[0]**2+f[1]**2))/g+A[0],(e[0]*(f[0]**2+f[1]**2)-f[0]*(e[0]**2+e[1]**2))/g+A[1]));h=S((b*b+c*c-a*a)/(2*b*c));i=S((a*a+c*c-b*b)/(2*a*c));j=S((a*a+b*b-c*c)/(2*a*b));k=D(i)*D(j);l=D(h)*D(j);m=D(h)*D(i);R(((a*k*A[0]+b*l*B[0]+c*m*C[0])/(a*k+b*l+c*m),(a*k*A[1]+b*l*B[1]+c*m*C[1])/(a*k+b*l+c*m)));n,o=r[1][0]-r[2][0],r[1][1]-r[2][1];q=r[1][1]-o/n*r[1][0]if n!=0else 0;R(r[1]if a==b==c else("x="+T(r[1][0])if n==0else"".join([T(o/n),"x+(",T(q),")"])));print(r[p])


1
क्या आप कुछ ऐसा कर सकते हैं R=r.appendऔर फिर बाइट्स को बचाने के लिए इसका इस्तेमाल कर सकते हैं ?
पलटें

1

ऑटोहोटी - 731

f(z, r:=1){
static 1:="i",2:="m",3:="c",4:="o"
r := %r%,mx :=(z.1.1+z.2.1+z.3.1)/3,my:=(z.1.2+z.2.2+z.3.2)/3
s:=(c:=sqrt((z.2.1-z.1.1)**2+(z.2.2-z.1.2)**2))+(a:=sqrt((z.3.1-z.2.1)**2+(z.3.2-z.2.2)**2))+(b:=sqrt((z.3.1-z.1.1)**2+(z.3.2-z.1.2)**2))
ix:=(a*z.1.1+b*z.2.1+c*z.3.1)/s,iy:=(a*z.1.2+b*z.2.2+c*z.3.2)/s
midx_a:=(z.3.1+z.2.1)/2,midy_a:=(z.3.2+z.2.2)/2,m:=-1*(z.3.1-z.2.1)/(z.3.2-z.2.2),cc_a:=midy_a-(m*midx_a)
midx_b:=(z.3.1+z.1.1)/2,midy_b:=(z.3.2+z.1.2)/2,n:=-1*(z.3.1-z.1.1)/(z.3.2-z.1.2),cc_b:=midy_b-(n*midx_b)
cx:=(cc_b-cc_a)/(m-n),cy:=cc_a+(m*cx),oc_a:=z.1.2-(m*z.1.1),oc_b:=z.2.2-(n*z.2.1),ox:=(oc_a-oc_b)/(n-m),oy:=oc_a+(m*ox)
if r in m,i,c,o
return [%r%x, %r%y]
else return "y=" (m:=(oy-cy)/(ox-cx)) "x+" oy-m*ox
}

Midx_a, midx_b और जैसे चर नामों को छोटा करके फ़ंक्शन को और अधिक छोटा (लगभग 600 वर्णों या उससे कम) किया जा सकता है।

फ़ंक्शन को कॉल करना

d:=f([[-2, 0], [1, 0], [0, 1]], 1)
for k,v in d
    msgbox % k "`n" v

1

पायथन 3.5, 851 772 बाइट्स:

def H(z,a,b,l):c=complex;T=lambda A,B:abs(c(*A)-c(*B));d=T(z,a);e=T(z,b);f=T(a,b);g=[((a[0]+b[0])/2,(a[1]+b[1])/2)for a,b in[[a,b],[z,a],[b,z]]];E=(z[0]+a[0]+b[0])/3;F=(z[1]+a[1]+b[1])/3;m=lambda f:[(a,0)if(b[1][0]-b[0][0])==0else(a,-1/((b[1][1]-b[0][1])/(b[1][0]-b[0][0])))if(b[1][1]-b[0][1])else''for a,b in zip(f,[[a,b],[z,a],[b,z]])];i=[u for u in m(g)if u!=''];C=i[0][1];D=i[0][0][1]-(C*i[0][0][0]);A=i[1][1];B=i[1][0][1]-(A*i[1][0][0]);G=(B-D)/(C-A);H=C*G+D;j=[u for u in m([z,b,a])if u!=''];C=j[0][1];D=j[0][0][1]-(C*j[0][0][0]);A=j[1][1];B=j[1][0][1]-(A*j[1][0][0]);I=(B-D)/(C-A);J=C*I+D;K,L=[((d*b[o])+(e*a[o])+(f*z[o]))/sum([d,e,f])for o in[0,1]];a=(H-J)/(G-I)if(G-I)else'';b=H-(a*G)if a!=''else G;print(['',(K,L),(E,F),(G,H),(I,J),[b,'%sx+%s'%(a,b)][a!='']][l])

ले जाता है इनपुट अल्पविराम से अलग निर्देशांक एक पूर्णांक उत्पादन के लिए क्या संदेश के बाद की एक अनुक्रम के रूप में। उदाहरण के लिए, यदि इनपुट निर्देशांक हैं (1,0),(2,1),(1,4)और आप त्रिभुज के ऑर्थोसेंटर को उन निर्देशांकों के अनुरूप चाहते हैं, जिसे आप बस फ़ंक्शन को कॉल करेंगे:

H((1,0),(2,1),(1,4),4)

एक विशिष्ट बिंदु की आवश्यकता होने पर टुपल के प्रारूप में आउटपुट , अगर स्ट्रिंग की प्रारूप में समीकरण के साथ y=mx+bअगर यूलर लाइन की जरूरत है और लाइन वर्टिकल नहीं है, या xलाइन का मान केवल तभी है जब यूलर लाइन जरूरत है, लेकिन लाइन है खड़ी।

तो, वर्टिकल के साथ त्रिभुज का उपयोग करना (1,0),(2,1),(1,4), आउटपुट होगा:

1. Incenter: (1.4663911961440428, 1.125967951102358)
2. Centroid: (1.3333333333333333, 1.6666666666666667)
3. Circumcenter: (0.0, 2.0)
4. Orthocenter: (4.0, 1.0)
5. Euler Line: -0.25x+2.0 

मैं समय के साथ इसे और अधिक गोल्फ करने की कोशिश करूँगा जहाँ और जब मैं कर सकता हूँ।

यह ऑनलाइन की कोशिश करो! (Ideone)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.