तीन-सूचक! लेकिन किस तरह का?


24

से http://en.wikipedia.org/wiki/Triangle : यहाँ छवि विवरण दर्ज करें


एक प्रोग्राम लिखें जो तीन 2d समन्वय ट्यूपल्स (कार्टेशियन) लेता है, और वर्गीकृत करता है कि इन तीन बिंदुओं का वर्णन किस आकार का है।

लगभग सभी मामलों में ये बिंदु अलग-अलग प्रकार के त्रिकोण का वर्णन करेंगे। कुछ पतित मामलों में, अंक या तो एक विलक्षण बिंदु या एक सीधी रेखा का वर्णन करेंगे। कार्यक्रम निर्धारित करेगा कि निम्नलिखित में से कौन सा टैग वर्णित आकृति पर लागू होता है:

  • बिंदु (3 बिंदु सह-घटना हैं)
  • लाइन (एक सीधी रेखा पर 3 बिंदु झूठ बोलते हैं - 2 से अधिक बिंदु सह-घटना नहीं हो सकते)
  • समबाहु (3 पक्ष बराबर, 3 कोण बराबर)
  • समद्विबाहु (2 पक्ष बराबर, 2 कोण बराबर)
  • स्केलीन (0 भुजाएँ बराबर, 0 कोण बराबर)
  • दायां (1 कोण बिल्कुल π / 2 (या 90 °))
  • ओब्लिक (0 कोण बिल्कुल π / 2 (या 90 °))
  • Obtuse (1 कोण> π / 2 (या 90 °))
  • तीव्र (3 कोण <π / 2 (या 90 °))

ध्यान दें कि कुछ वर्णित आकृतियों के लिए, उपरोक्त टैग्स में से एक से अधिक लागू होंगे। उदाहरण के लिए, कोई भी समकोण या तो समद्विबाहु या खोपड़ी होगा।

इनपुट

  • कार्यक्रम STDIN, कमांड-लाइन, पर्यावरण चर या जो भी विधि आपकी पसंद की भाषा के लिए सुविधाजनक है, से 3 इनपुट निर्देशांक पढ़ सकता है।
  • इनपुट को समन्वित किया जाता है, लेकिन मुझे आपकी पसंद की भाषा के लिए सुविधाजनक है। यह माना जा सकता है कि आपके द्वारा उपयोग किए जा रहे डेटाटाइप्स के संबंध में सभी इनपुट नंबर अच्छी तरह से बने हैं।
  • इनपुट निर्देशांक के क्रम के बारे में कुछ भी नहीं माना जा सकता है।

उत्पादन

  • कार्यक्रम STDOUT, संवाद बॉक्स या जो भी प्रदर्शन विधि आपकी पसंद की भाषा के लिए सुविधाजनक है, को आउटपुट देगा।
  • आउटपुट इनपुट निर्देशांक द्वारा वर्णित आकृति पर लागू सभी टैग प्रदर्शित करेगा।
  • टैग किसी भी क्रम में आउटपुट हो सकता है।

अन्य नियम

  • आपकी भाषा के त्रिकोणमितीय पुस्तकालयों / एपीआई की अनुमति है, लेकिन विशेष रूप से त्रिकोण प्रकारों की गणना करने वाले किसी भी एपीआई पर प्रतिबंध है।
  • जब कोण या पक्षों की लंबाई की समानता निर्धारित करते हैं, तो आप फ्लोटिंग-पॉइंट मानों की तुलना करने की संभावना रखेंगे। यदि इस तरह के दो मूल्यों को "बराबर" माना जाता है, अगर एक दूसरे के 1% के भीतर हो।
  • मानक "कमियां" जो अब मज़ेदार नहीं हैं
  • यह , इसलिए बाइट्स में सबसे कम जवाब जीतता है।

उदाहरण

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 उस स्थिति में यह एक रेखा है।
डिजिटल ट्रामा

त्रिकोण टैग
डेरेक 會 會 '

2
"एक्यूट" परिभाषा के साथ कोई समस्या है? यह असंभव है कि सभी कोण पीआई / 2 से अधिक हैं?
अरनौद

जवाबों:


10

सी (451 बाइट्स)

केवल चौकोर लंबाई और ढलान का उपयोग करता है।

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
}

इनपुट (स्टडिन के माध्यम से) प्रारूप: xyxyxy

पूर्व। Isosceles Right के लिए 0 0 1 1 2 0


@digitaltrauma ./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,cahd को 9,11,13 लिखा जाता है ( और एक्सेस किया जाता है)।sit[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[]ढलान गणना के लिए आवश्यक dx और डाई मूल्यों को रखने के लिए देर से जोड़ा गया था। उपयोग की जाने वाली एकमात्र कोशिकाएं 9 में से 6 हैं (5 के माध्यम से 0 अविश्वसनीय हैं क्योंकि सभी डेटा उपलब्ध नहीं हैं जब उन्हें लिखा जाता है।) यदिg[6]/g[7]==g[8]/g[9] 2 लाइनों का ढलान बराबर है और त्रिकोण सिर्फ एक रेखा (या एक बिंदु) है। विभाजन से बचने के लिए कार्यक्रम में पुनर्व्यवस्थित किया जाता है।

rएक मध्यवर्ती मूल्य है जिसका उपयोग वर्ग के लिए किया जाता है

zलंबाई शून्य के पक्षों की संख्या की गणना करता है। इसमें +3 की भरपाई होती है क्योंकि लूप 3 रिक्त कोशिकाओं को पढ़ता है t[]

cपक्षों की संख्या की गणना करता है जो समान लंबाई के होते हैं। इसमें +3 का ऑफसेट भी है। ध्यान दें कि पक्ष aको लिखा हैt[] एक = बी, बी = सी, सी = ए की जांच करने में सक्षम होने के दो बार है।

bएक पक्ष की सबसे बड़ी लंबाई है, चुकता। sसभी पक्षों के वर्गों का योग है।

ध्यान दें कि साइड की लंबाई A ^ 2 + B ^ 2 + C ^ 2 के साथ 2 * B ^ 2 है, A ^ 2 + C ^ 2 की तुलना B ^ 2 (दोनों तरफ से B ^ 2 को घटाएं।) इस प्रकार है। अगर B ^ 2 = A ^ 2 + C ^ 2 यह एक सही त्रिकोण है। यदि B ^ 2 अधिक है, तो यह बहुत अधिक तीव्र है, यदि यह छोटा है।


प्रश्न में आरेख के आधार पर, समबाहु त्रिभुज को समद्विबाहु त्रिभुज के रूप में भी वर्गीकृत किया जाना चाहिए। (दूसरी ओर, पूर्णांक निर्देशांक के साथ एक समबाहु त्रिभुज बनाना असंभव है।)
es1024

@ es1024 त्रिभुज (0,0) (4,7) (8,0) इतने करीब हो जाता है (चुकता पक्ष की लंबाई 64,652.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% के भीतर "समानता" अर्थ मूल्यों के बारे में नियम को शामिल किया है
डिजिटल ट्रॉमा

यदि मैं गलत नहीं हूँ, तो आपने इसे फ़्लोट के लिए कहा है, न कि पूर्णांक के लिए: ".. आप संभवतः बिंदु-बिंदु मानों की तुलना करते हुए समाप्त हो जाएंगे। दो ऐसे मानों को 'बराबर' माना जाएगा यदि एक दूसरे के 1% के भीतर है। । "
काइल मैककॉर्मिक

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 दिनों के लिए मुफ्त है।
फॉस्जीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.