তিন-পয়েন্টার! তবে কী রকম?


24

Http://en.wikedia.org/wiki/Triangle থেকে : এখানে চিত্র বর্ণনা লিখুন


এমন একটি প্রোগ্রাম লিখুন যাতে তিন ত্রি সমন্বয়মূলক টিপলস (কার্টেসিয়ান) লাগে এবং এই তিনটি পয়েন্টকে কী আকার দেয় তা শ্রেণিবদ্ধ করে।

প্রায় সব ক্ষেত্রেই এই পয়েন্টগুলি বিভিন্ন ধরণের একটি ত্রিভুজ বর্ণনা করে। কিছু অবক্ষয়যুক্ত ক্ষেত্রে পয়েন্টগুলি একটি একক বিন্দু বা একটি সরলরেখাকে বর্ণনা করবে। প্রোগ্রামটি বর্ণিত আকারের জন্য নিম্নলিখিত কোন ট্যাগ প্রয়োগ করে তা নির্ধারণ করবে:

  • পয়েন্ট (3 পয়েন্ট সহ-ঘটনা)
  • রেখা (3 পয়েন্ট সরলরেখায় থাকে - 2 পয়েন্টের বেশি কোনও সহ-ঘটনা নাও হতে পারে)
  • সমতুল্য (3 টি পক্ষ সমান, 3 টি কোণ সমান)
  • আইসোসেলস (2 টির সমান, 2 টি কোণ সমান)
  • স্কেলিন (0 টি সমান সমান, 0 কোণ সমান)
  • ডান (1 টি কোণে ঠিক π / 2 (বা 90 °))
  • তির্যক (0 টি কোণে ঠিক π / 2 (বা 90 °))
  • অভ্যাস (1 কোণ> π / 2 (বা 90 °))
  • তীব্র (3 টি কোণ <π / 2 (বা 90 °))

নোট করুন যে বর্ণিত কিছু আকারের জন্য উপরের ট্যাগগুলির একটিরও বেশি প্রয়োগ করা হবে। উদাহরণস্বরূপ, যে কোনও ডান-কোণযুক্ত হয় হয় আইসোসিল বা স্কেলেনও।

ইনপুট

  • প্রোগ্রামটি STDIN, কমান্ড-লাইন, এনভায়রনমেন্ট ভেরিয়েবল বা আপনার পছন্দের ভাষার জন্য উপযুক্ত যে কোনও পদ্ধতি থেকে 3 ইনপুট স্থানাঙ্ক পড়তে পারে।
  • ইনপুটটি আমার বিন্যাসিত সমন্বয় স্থিত করে তবে আপনার পছন্দের ভাষার জন্য সুবিধাজনক। এটি ধরে নেওয়া যায় যে সমস্ত ইনপুট নম্বরগুলি আপনি ব্যবহার করেছেন এমন ডেটাটাইপগুলিতে সম্মানজনকভাবে তৈরি।
  • ইনপুট স্থানাঙ্কগুলির ক্রম সম্পর্কে কিছুই অনুমান করা যায় না।

আউটপুট

  • প্রোগ্রামটি আপনার পছন্দমতো ভাষার জন্য স্টডআউট, ডায়লগ বাক্স বা যে কোনও প্রদর্শন পদ্ধতিতে সুবিধাজনক হবে।
  • আউটপুট ইনপুট স্থানাঙ্ক দ্বারা বর্ণিত আকারের জন্য প্রযোজ্য সমস্ত ট্যাগ প্রদর্শন করবে।
  • ট্যাগগুলি কোনও ক্রমে আউটপুট হতে পারে।

অন্যান্য বিধি

  • আপনার ভাষার ট্রিগনোমেট্রিক লাইব্রেরি / এপিআই অনুমোদিত, কিন্তু বিশেষত ত্রিভুজ ধরণের গণনা করে এমন কোনও API নিষিদ্ধ করা হয়েছে।
  • কোণগুলির দৈর্ঘ্য বা দৈর্ঘ্য নির্ধারণ করার সময় আপনি সম্ভবত ভাসমান-পয়েন্ট মানের তুলনা করতে পারেন। এর মধ্যে দুটি মানকে "সমান" হিসাবে বিবেচনা করা হয় যদি অন্যটির 1% এর মধ্যে থাকে।
  • স্ট্যান্ডার্ড "লুফোলস" যা আর মজার নয়
  • এটি , তাই বাইটের মধ্যে সংক্ষিপ্ত উত্তর ins

উদাহরণ

Input                   Output
(1,2) (1,2) (1,2)       Point
(1,2) (3,4) (5,6)       Line
(0,0) (1,1) (2,0)       Isosceles Right
(0,0) (2,1) (10,1)      Scalene Oblique Obtuse

4
আমি এই " ত্রিভুজ ট্যাগ " এনটাইটেল করতে যাচ্ছিলাম তবে এটি সর্বনিম্ন 15-অক্ষরের চেয়ে কম হয়ে গেছে।
ডিজিটাল ট্রমা

যদি দুটি পয়েন্ট একই হয়?
Ypnypn

@Ypnypn সেক্ষেত্রে এটি একটি লাইন।
ডিজিটাল ট্রমা

ত্রিভুজ ট্যাগ
ডেরেক 朕 會 功夫

2
"তীব্র" সংজ্ঞা নিয়ে কোন সমস্যা আছে? এটি অসম্ভব যে সমস্ত কোণ পিআই / 2 এর চেয়ে বেশি?
আর্নাউড

উত্তর:


10

সি (451 বাইট)

কেবল স্কোয়ার দৈর্ঘ্য এবং opালু ব্যবহার করে।

p[2],q[2],r[2];z(c){char*y[]={"Line","Point","Isosceles ","Equilateral ","Scalene ","Right","Oblique ","Acute","Obtuse"};printf(y[c]);}d(int*a,int*b){int c=*a++-*b++,e=*a-*b;return c*c+e*e;}main(){scanf("%d%d%d%d%d%d",p,p+1,q,q+1,r,r+1);int a=d(p,q),b=d(q,r),c=d(r,p),e=!a+!b+!c,f=(a==b)+(b==c)+(c==a),g=a>b&&b>c?a:b>c?b:c,h=g^a?g^b?a+b:c+a:b+c;e?z(e/2):(1[q]-1[p])*(*r-*q)^(1[r]-1[q])*(*q-*p)?f?z(2+f/2),f-1&&z(2):z(4),h^g?z(6),z(7+(h<g)):z(5):z(0);}

অবরুদ্ধ

int p[2],q[2],r[2];

void print(c){
    char *y[]={"Line","Point","Isosceles ","Equilateral ","Scalene ","Right","Oblique ","Acute","Obtuse"};
    printf(y[c]);
}
squared_distance(int *a,int *b){
    int c = *a++ - *b++, e = *a - *b;
    return c*c+e*e;
}
main(){
    scanf("%d%d%d%d%d%d",p,p+1,q,q+1,r,r+1); // read in coordinates
    int a = squared_distance(p,q),b = squared_distance(q,r),c = squared_distance(r,p),
    e=!a+!b+!c, // number of sides of length 0
    f=(a==b)+(b==c)+(c==a), // number of equal-length pairs
    g = a > b && b > c ? a : (b > c ? b : c), // longest side
    h = g != a ? g != b ? a + b : c + a : b + c; // sum of squares of length of other two sides
    if(e)
        print(e/2); // 1 side of len 0: line, 3 sides: point
    // comparing slopes PQ and QR
    else if((q[1]-p[1])*(*r-*q) != (r[1]-q[1])*(*q-*p)){ // not line
        if(f){
            print(2+f/2); // 1 pair of equal length sides: isosceles, 3: equilateral
            if(f-1) print(2); // equilateral therefore also isosceles
        }else print(4); // 0: scalene
        if(h!=g){ // a^2+b^2!=c^2: not right
            print(6); // oblique
            print(7+(h<g)); // a^2+b^2<c^2:obtuse, acute otherwise 
        }else print(5); // right
    }else
        print(0); // line
}

ইনপুট (স্টাডিনের মাধ্যমে) ফর্ম্যাট: জাইক্সিক্সি

প্রাক্তন। আইসোসেলস ডান জন্য 0 0 1 1 2 0


@ ডিজিটালট্রামা ./triangle <<< "1 2 1 2 1 2"ব্যবহার করা উচিত, উদ্ধৃতি সহ।
es1024

হ্যাঁ, অবশ্যই, সে সম্পর্কে দুঃখিত। চমৎকার উত্তর. আমি বিশেষত পছন্দ করি যে আপনি ভাসমানগুলি এড়াতে সক্ষম হয়েছিলেন এবং এভাবে 1% সমতা নিয়মের জিনিসটির মধ্যে চিন্তা করার দরকার নেই। +1
ডিজিটাল ট্রমা

3

সি, 333

z,c,r,b,s,i,t[14],g[14];
main(){ 
  for(;i<14;i++){
    g[i]=r=t[(i+2)%6]-t[i%6];r*=r;t[i|1]+=r;
    i<6&&scanf("%d",t+i);
    i>7&&(b<t[i]&&(b=t[i]),s+=t[i],z+=!t[i],c+=t[i]==t[i-2]);  
  }

  if(g[6]*g[9]==g[8]*g[7])puts(z==6?"point":"line");else
    printf(b*2==s?"right ":"oblique %s",b*2>s?"obtuse ":"acute "),puts(c>3?c>5?"equilateral":"isosceles":"scalene");
}

আমি মুহুর্তের জন্য সাদা স্থান ছেড়ে দিলাম। এটি কাজ করে তবে সম্ভবত কিছু পরিশ্রম ও গল্ফ করে। @es1024এর উত্তরের অনুরূপ গণিত , তবে লুপ এবং অ্যারে ব্যবহার করে। ছক পূরণ করাx y x y x y

ভেরিয়েবল

t[]উভয় ইনপুট এবং দৈর্ঘ্যের স্কোয়ার সঞ্চয় করে। প্রোগ্রামের শেষে এটি দেখতে নীচের টেবিলের মতো মনে হয় (লুপটির পুনরাবৃত্তির সংখ্যা বৃদ্ধি করা স্কোয়ার দৈর্ঘ্যের অনির্দিষ্টকালের পুনরাবৃত্তির দিকে নিয়ে যায়)) লুপের লুপের স্কোয়ারের শুরুতে (সমস্ত ডেটা উপলব্ধ নয় এমন আবর্জনা) ) অযথা কোষ 1,3 ও 5 সঞ্চিত হয়, কিন্তু অবিলম্বে দ্বারা ওভাররাইট হয় scanf.দরকারী তথ্য লেখা আছে z,b,cআবদ sযখন i= 9,11,13 ( t[i]এবং t[i-2]ব্যবহার করা হয়।)

01 23 45 67 89 1011 1213
aa bb cc  a  b    c    a
xy xy xy  L  L    L    L

g[]opeাল গণনার জন্য প্রয়োজনীয় dx এবং dy মানগুলি ধরে রাখতে দেরীতে যুক্ত করা হয়েছিল। কেবলমাত্র ব্যবহৃত কোষগুলি 6 থেকে 9 এর মধ্যে রয়েছে (0 থেকে 5 এর মধ্যে অবিশ্বাস্য কারণ সেগুলি লেখার সময় সমস্ত ডেটা উপলব্ধ হয় না)) যদি g[6]/g[7]==g[8]/g[9]2 লাইনের opালু সমান হয় এবং ত্রিভুজটি কেবল একটি রেখা (বা একটি বিন্দু) হয় তবে সমীকরণ বিভাগ এড়ানোর জন্য প্রোগ্রামে পুনরায় সাজানো হয়।

rস্কোয়ারিংয়ের জন্য ব্যবহৃত একটি মধ্যবর্তী মান

zদৈর্ঘ্যের শূন্যের পক্ষের সংখ্যা গণনা করে। এটি একটি +3 অফসেট কারণ লুপ 3 ফাঁকা কোষ সার্চ করেছে t[]

cঅভিন্ন দৈর্ঘ্যের পক্ষের সংখ্যা গণনা করে। এটিতে +3 এর অফসেটও রয়েছে। নোট করুন যে পাশটি দুবার aলিখিত t[]হয়েছিল যাতে a = b, b = c, c = a পরীক্ষা করতে সক্ষম হয়।

bবর্গক্ষেত্রের দিকের বৃহত্তম দৈর্ঘ্য। sসমস্ত পক্ষের বর্গের যোগফল।

নোট করুন যে পাশের দৈর্ঘ্যের A A 2 + B ^ 2 + C ^ 2 এর সাথে 2 * B ^ 2 এর তুলনা করা B ^ 2 এর সাথে A ^ 2 + C ^ 2 এর তুলনা করার মতো (উভয় পক্ষ থেকে কেবল বি ^ 2 বিয়োগ করুন।) সুতরাং যদি B ^ 2 = A ^ 2 + C ^ 2 হয় তবে এটি একটি সঠিক ত্রিভুজ। যদি বি ^ 2 এর চেয়ে বড় হয় তবে এটি অবটুস, যদি ছোট হয় তবে এটি তীব্র।


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

@ es1024 ত্রিভুজটি (0,0) (4,7) (8,0) এত কাছাকাছি হয়ে যায় (স্কোয়ার পাশের দৈর্ঘ্য 64,65,65)। এটি যদি আপনি 60 ডিগ্রি কোণ আঁকতে চান (তবে নিজের আইসোমেট্রিক ডট পেপার তৈরি করে বা আমার ঘড়ি আঁকতে আমার অন্য উত্তরগুলির মধ্যে একটিতে স্নোফ্লেকস অঙ্কন করতে চান) এটি খুব সহজেই) যদি এবং আমি এই কোডটি সংশোধন করি তবে প্রশ্নের তুলনায় আমি তুলনাটির সাথে 1% সহনশীলতা যুক্ত করতে পারি।
স্তর নদী

2

গল্ফস্ক্রিপ্ট (175 বাইট)

~..|,({.)2$([\;\]@(;]{{~}/@- 2?@@- 2?+}%$.{2-1??100*}/-+abs 1<{;"Line"}{.[]|,((["Isosceles ""Scalene "]=\~-+.!["Oblique ""Right "]=\.!\0>-)["Acute ""Obtuse "]=}if}{;"Point "}if

আপনি এটি এখানে পরীক্ষা করতে পারেন (পরীক্ষার সেট অন্তর্ভুক্ত)।

ছক পূরণ করা:

"[x y][x y][x y]"

মন্তব্য করা সংস্করণ:

~                       # evaluates input string          
..|,(                   # pushes the number of unique coords - 1
{
  .)2$([\;\]@(;]        # makes all 3 possible pairings of coords
  {{~}/@- 2?@@- 2?+}%$  # gets all squares of side lengths 
  .{2-1??100*}/-+abs 1< # 0 if triangle, 1 if line
  {;"Line"}
  {
     .[]|,((["Isosceles ""Scalene "]=\   # removes duplicate side-squares,
                                         #   and use the count to determine
                                         #   if isosceles or scalene (no
                                         #   equilaterals will exist)
     ~-+.!["Oblique ""Right "]=\         # compute a^2 + b^2 - c^2. Use to
                                         #   determine if oblique or right.
                                         #   c = max side length 
     .!\0>-)["Acute ""Obtuse "]=         # use same value to determine if
                                         #   acute, obtuse, or right
  }
  if
}
{;"Point "}
if

বিঃদ্রঃ:

আমার কোডটিতে "সমতুল্য" আউটপুট না থাকার কারণ হ'ল:

  • ওপি বলেছিল "আপনি যে ডেটাটাইপগুলি ব্যবহার করে শেষ করেছেন তাতে সমস্ত ইনপুট নম্বর সুসংহত হয়"
  • গল্ফস্ক্রিপ্টে ভাসমান পয়েন্ট সংখ্যা নেই - কোনওভাবেই সহজাতভাবে নয়
  • এখানে প্রমাণিত হিসাবে পূর্ণসংখ্যা স্থানাঙ্কের সাথে একটি সমতুল্য ত্রিভুজ থাকা (একটি 2-মাত্রিক গ্রিডে) অসম্ভব ।

আপনার নোটগুলি সঠিক - এজন্য আমি "সমতা" অর্থের 1% এর মধ্যে মানগুলির সম্পর্কে নিয়মটি অন্তর্ভুক্ত করেছি
ডিজিটাল ট্রমা

যদি আমি ভুল না হয়ে থাকি তবে আপনি এটি ভাসমানদের জন্য বলেছিলেন, পূর্ণসংখ্যার জন্য নয়: "..আপনি সম্ভবত ভাসমান-বিন্দু মানের তুলনা শেষ করবেন one । "
কাইল ম্যাককর্মিক

0

গণিত ( 313 307 টি অক্ষর)

Golfed:

f@p_:=(P=Print;R=RotateLeft;L=Length;U=Union;If[L@U@p==1,P@"Point",If[Det[Join[#,{1}]&/@p]==0,P@"Line",v=p-R@p;a=MapThread[VectorAngle[#,#2]&,{-v,R@v}];u=L@U[Norm/@v];If[u==1,P@"Equilateral",If[u==2,P@"Isosceles",P@"Scalene"]];If[MemberQ[a,Pi/2],P@"Right",P@"Oblique";If[Max@a>Pi/2,P@"Obtuse",P@"Acute"]]]])

Ungolfed:

f@p_ := (
  P = Print;    (* make aliases for functions used more than once *)
  R = RotateLeft;
  L = Length;
  U = Union;
  If[L@U@p == 1,    (* if all points identical *)
   P@"Point",
   If[Det[Join[#, {1}] & /@ p] == 0,    (* if area is zero *)
    P@"Line",
    v = p - R@p;    (* cyclic vectors *)
    a = MapThread[VectorAngle[#, #2] &, {-v, R@v}];    (* interior angles *)
    u = L@U[Norm /@ v];    (* number of unique side lengths *)
    If[u == 1,
     P@"Equilateral",
     If[u == 2,
      P@"Isosceles",
      P@"Scalene"
      ]
     ];
    If[MemberQ[a, Pi/2],
     P@"Right",
     P@"Oblique";
     If[Max@a > Pi/2,
      P@"Obtuse",
      P@"Acute"
      ]
     ]
    ]
   ]
  )

ইনপুট ফর্ম্যাটটি পয়েন্টগুলির একটি তালিকা, যার উপরে ফাংশনটি বলা হয়:

points = {{x1,y1},{x2,y2},{x3,y3}};
f@points

আমি একজন গণিতের রুকি। আমি কোথায় একজন দোভাষী / সংকলক ডাউনলোড করতে পারি বা অনলাইনে এটি চেষ্টা করতে পারি (নিঃসন্দেহে ;-))?
ডিজিটাল ট্রমা

আমি এটি কখনও ব্যবহার করি নি, তবে ওল্ফ্রামের একটি 'সিডিএফ প্লেয়ার' ব্রাউজার অ্যাপ্লিকেশন রয়েছে যা সিডিএফ ফর্ম্যাটে সঞ্চিত ম্যাথামেটিকা ​​ফাইলগুলি চালানোর দাবি করে, তবে নিয়মিত নোটবুক নয়। এখানে পাওয়া গেছে: wolfram.com/cdf-player এর বাইরেও মূল প্রোগ্রাম রয়েছে, যা আমি বিশ্বাস করি 30 দিনের জন্য বিনামূল্যে is
ফসগেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.