একটি ত্রিভুজ কেন্দ্র


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`))

আপনি ধরে নিতে পারেন যে প্রদত্ত উল্লম্বগুলি কখনও কলিনারি হবে না এবং তারা সর্বদা পূর্ণসংখ্যার স্থানাঙ্ক হবে (এটি @ আর কেপ এর মন্তব্য অনুসারে একটি ইনপুট হিসাবে সমতুল্য ত্রিভুজ থাকার সম্ভাবনা বাদ দেয় )।

ইনপুট অ্যারেটি আপনার ভাষায় একটি বৈধ নেস্টেড অ্যারে হওয়া উচিত এবং ইনপুটটি কোনও যুক্তিসঙ্গত বিন্যাসে হওয়া উচিত। যে কোনও ফ্লোট মানগুলি কমপক্ষে 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

স্পষ্টকরণ: ইনপুটটি স্টিডিন হতে পারে, স্থান বা নতুন-লাইন পৃথক করা, বা কোনও ফাংশনের যুক্তি হিসাবে ments আউটপুট, অবশ্য, stdout লিখতে হবে।


1
আমি ভয় পাচ্ছি কার্টেসিয়ান স্থানাঙ্কগুলিতে প্রদত্ত পরিদর্শনকারী এবং অর্থোসেন্টারের সুস্পষ্ট সূত্রগুলি বেশ কুৎসিত। আমি যদি কোনও সাধারণ ত্রিলিনিয়ার / ব্যারিসেন্ট্রিক => কার্থেসিয়ান স্থানাঙ্ক তৈরির পথে চলে যাই তবে উত্সাহটি প্রায় নিখরচায় চলে যায়। En.wikedia.org/wiki/Trolinear_coordinates# উদাহরণ দেখুন । আমি এটি প্রয়োগ করার জন্য অতিরিক্ত পয়েন্ট পেতে পারি?
জন ডিভোরাক

ইউলার লাইনের বৈধ আউটপুট ফর্ম্যাটগুলি কী কী? এটি উল্লম্ব হলে এটি হিসাবে প্রকাশ করা যায় না 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
}

মিডএক্স_এ, মিডএক্স_ বি ইত্যাদির মত চলক নামগুলি সংক্ষিপ্ত করে ফাংশনটি আরও কম (প্রায় 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)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.