चतुर्भुजों को वर्गीकृत करें | मेरी गणित की परीक्षा में मेरी मदद करो!


20

मदद! मेरी गणित की परीक्षा जल्द ही आ रही है और मैंने पढ़ाई नहीं की! 1 परीक्षा का एक हिस्सा अपने चतुर्भुज निर्देशांक को देखते हुए चतुर्भुज को वर्गीकृत करना है, जो कि, दुर्भाग्य से, मुझे नहीं पता कि कैसे करना है। 2

तो, आपकी चुनौती मेरे लिए ऐसा करने के लिए एक कार्यक्रम लिखने की है ताकि मैं असफल न होऊं!

चुनौती

चार वर्टिकल को देखते हुए कि उनमें से कोई भी तीन कोलीनियर नहीं हैं, उन चार सिरों द्वारा गठित चतुर्भुज का सबसे विशिष्ट वर्गीकरण निर्धारित करते हैं।

"सबसे विशिष्ट वर्गीकरण" से मेरा तात्पर्य यह है कि भले ही सभी वर्ग आयताकार हों, यदि आकृति एक वर्ग है, तो आपको संकेत देना चाहिए कि यह एक वर्ग है और यह संकेत नहीं देता है कि यह एक आयत है।

इनपुट

इनपुट चार (x, y) निर्देशांक के रूप में दिया जाएगा। आप इन्हें सूची 4 की लंबाई / लंबाई के tuples 2 की सूची के रूप में ले सकते हैं। वैकल्पिक रूप से, आप x- निर्देशांक और संबंधित y-निर्देशांक की सूची के रूप में इनपुट ले सकते हैं।

उदाहरण के लिए, अगर मेरे आकार बिंदुओं पर कोने है (0, 0), (5, 0), (6, 1), और (1, 1), आप निम्न स्वरूपों या कुछ इसी तरह से किसी में इनपुट लेने के लिए चुन सकते हैं:

[(0, 0), (5, 0), (6, 1), (1, 1)]
([0, 5, 6, 1], [0, 0, 1, 1])

आप मान सकते हैं कि चतुर्भुज स्व-प्रतिच्छेदन नहीं है और यह कि अंक सही क्रम में दिए गए हैं (यानी इनपुट में दो लगातार बिंदु चतुर्भुज में एक लाइन खंड से जुड़े होंगे)।

उत्पादन

आपको निम्न वर्ग के प्रत्येक वर्ग के लिए एक अद्वितीय आउटपुट की आवश्यकता होगी:

  • वर्ग
  • आयत
  • विषमकोण
  • चतुर्भुज
  • चतुर्भुज / समलंब
  • पतंग
  • चतुष्कोष

यह सटीक नाम ही हो सकता है, एक चरित्र, एक पूर्णांक, आदि।

नियम

  • स्टैंडर्ड लोफॉल्स लागू होते हैं
  • यदि आपकी प्रोग्रामिंग लैंग्वेज में बिल्ट-इन है, तो यह सटीक कार्य करेगा, बिल्ट-इन की अनुमति नहीं है।
  • दो बिंदुओं के बीच की दूरी को खोजने के लिए अंतर्निहित इंसिडेंट की अनुमति है।
  • दो लाइनों के बीच के कोण को खोजने के लिए बिल्ट-इन की अनुमति है।

इस बिंदु पर, यदि आप सभी शर्तों को जानते हैं, तो आप प्रोग्रामिंग शुरू करने के लिए तैयार हैं! (टेस्ट के मामले अंत में हैं)

शब्दावली

यह खंड किसी के लिए भी है जिसे विभिन्न आकृतियों की परिभाषाओं पर स्पष्टीकरण की आवश्यकता है।

वर्ग

एक चतुर्भुज एक वर्ग है यदि और केवल यदि इसके सभी 4 पक्ष लंबाई में समान हैं और आस-पास के प्रत्येक जोड़े लंबवत हैं (अर्थात, यह एक आयत और एक रंबल दोनों है)।

आयत

एक चतुर्भुज एक आयत है अगर और केवल अगर आसन्न पक्षों के प्रत्येक जोड़ी लंबवत है।

विषमकोण

एक चतुर्भुज एक समचतुर्भुज है अगर और केवल यदि इसके सभी 4 पक्ष समान हैं।

चतुर्भुज

एक चतुर्भुज एक समांतर चतुर्भुज है यदि और केवल यदि विपरीत पक्षों की प्रत्येक जोड़ी समानांतर है और विपरीत कोणों की प्रत्येक जोड़ी समान है। ये दोनों स्थितियाँ एक-दूसरे को प्रभावित करती हैं, इसलिए आपको केवल उनमें से किसी एक की जाँच करनी होगी।

चतुर्भुज / समलंब

एक चतुर्भुज एक समलम्बाकार / समलम्बाकार है अगर और केवल अगर इसमें समानांतर पक्षों की कम से कम एक जोड़ी है।

पतंग

एक चतुर्भुज एक पतंग है अगर आसन्न पक्षों के दो विपरीत जोड़े लंबाई में समान हैं; अर्थात् इसके दो आसन्न भुजाएँ समान हैं और अन्य दो भी समान हैं।

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

input as (x, y) * 4 -> full name
[(0, 0), (1, 0), (1, 1), (0, 1)] -> square
[(0, 0), (1, 1), (-1, 3), (-2, 2)] -> rectangle
[(0, 0), (5, 0), (8, 4), (3, 4)] -> rhombus
[(0, 0), (5, 0), (6, 1), (1, 1)] -> parallelogram
[(0, 0), (4, 0), (3, 1), (1, 1)] -> trapezoid/trapezium
[(0, 0), (1, 1), (0, 3), (-1, 1)] -> kite  
[(0, 0), (2, 0), (4, 4), (0, 1)] -> quadrilateral

लिंक (डेसमोस ग्राफिंग कैलकुलेटर)

यहां प्रत्येक परीक्षण मामलों के विज़ुअलाइज़ेशन के लिंक दिए गए हैं।

स्क्वायर
आयत
Rhombus
Parallelogram
Trapezoid / Trapezium
पतंग
चतुर्भुज

जीत का मानदंड

मैं स्पष्ट रूप से परीक्षा में एक कंप्यूटर नहीं ला सकता हूं, इसलिए मुझे आपको सबसे छोटा कोड लिखना होगा ताकि मैं इसे याद कर सकूं। मुझे इसे हाशिये में लिखने और इसे TryItOffline TM का उपयोग करके चलाने की आवश्यकता है ताकि इसे हाशिये में फिट करने के लिए आपके कार्यक्रम को यथासंभव छोटा होना चाहिए!

1 बेशक मैंने वास्तव में किया था: P
2 बेशक मैं वास्तव में करता हूं: P


1
मैं आपकी मार्जिन समस्या xkcd.com/1381 के
रोहन झुनझुनवाला

@ रोहन झुनझुनवाला मैं नया फ़र्मेट हूं (मुझे लगता है कि यह सही व्यक्ति है?)। लेकिन अच्छा XKCD रेफरी: P
HyperNeutrino

क्या CSV को इनपुट की अनुमति है?
tuskiomi

विशिष्टता का आंशिक क्रम क्या है?
पीटर टेलर

जवाबों:


6

APL (Dyalog) , 104 89 80 82 81 79 78 बाइट्स

⍙←{⍵⍺⍺1⌽⍵}
⎕←(|x){⍵≡2⌽⍵:≡⍙¨0⍺⍵⋄2 4=+/1=2|+⍙↑⍵(=⍙⍺)}2|1+-⍙(12x←-⍙⎕+.×1 0J1)÷○1

इसे ऑनलाइन आज़माएं!


इनपुट आउटपुट

इनपुट के रूप में निर्देशांक के 4 × 2 मैट्रिक्स लेता है

आउटपुट

  • 1 1 1 स्क्वायर के लिए
  • 1 1 0 Rhombus के लिए
  • 1 0 1 आयत के लिए
  • 1 0 0 समांतर चतुर्भुज के लिए
  • 1 0 पतंग के लिए
  • 0 1 ट्रेपेज़ियम के लिए
  • 0 0 चतुर्भुज के लिए

कलन विधि

सबसे पहले, चतुर्भुज की सभी 4 भुजाओं की लंबाई और कोण ज्ञात करें

यदि विपरीत कोणों के दोनों जोड़े समान हैं ( OA), तो आकृति किसी प्रकार का समांतर चतुर्भुज है। निर्धारित करें कि सभी पक्ष लंबाई समान हैं ( AS, आसन्न पक्ष) और यदि सभी कोण समान हैं ( AA)।

+--------+----------------+----------------+
|        |       AA       |      ~AA       |
+--------+----------------+----------------+
|   AS   |     Square     |    Rhombus     |
|--------+----------------+----------------+
|  ~AS   |    Rectangle   |  Parallelogram |
+--------+----------------+----------------+

यदि नहीं OA, तो:

  • निर्धारित करें कि क्या समान आसन्न पक्षों के ठीक 2 जोड़े हैं और यदि वे अलग हो जाते हैं ( aabbबजाय aaab)। यदि हां, तो आकार एक पतंग है।

  • निर्धारित करें कि क्या समानांतर विपरीत पक्षों के ठीक 1 जोड़े हैं। यदि हां, तो आकृति एक ट्रेपेज़ियम है।

  • अन्यथा, आकार एक चतुर्भुज है।


कोड

⍙←{⍵⍺⍺1⌽⍵}एक नए ऑपरेटर को परिभाषित करता है। एपीएल में, एक ऑपरेटर का अर्थ है एक उच्च-क्रम फ़ंक्शन । यह ऑपरेटर 1 कार्यात्मक तर्क लेता है ( ⍺⍺) और एक मौद्रिक फ़ंक्शन देता है:

  1. 1⌽तर्क ( ) को घुमाता है ( )
  2. ⍺⍺इसके बीच आवेदन करें और

यह स्केलर फ़ंक्शंस के लिए विशेष रूप से उपयोगी है, क्योंकि उनमें से अधिकांश सरणी तर्कों के बीच नक्शा करते हैं, जिससे आस-पास के तत्वों के प्रत्येक आसन्न जोड़े के बीच उन लोगों को लागू करने की अनुमति मिलती है। उदाहरण के लिए +⍙1 2 3 4है 1 2 3 4 + 2 3 4 1जो करने के लिए मूल्यांकन करता है 3 5 7 5


x←-⍙⎕+.×1 0J1 इनपुट समन्वय मैट्रिक्स को आकार के 4 पक्षों के वैक्टर का प्रतिनिधित्व करने वाले जटिल संख्याओं की एक सरणी में परिवर्तित करता है।

  • , जब संदर्भित हो, तो इनपुट लेता है और वापस करता है

  • 1 0J1वेक्टर [1, i] (गणितीय अर्थ में "वेक्टर" और -1 के वर्गमूल के रूप में "i") का प्रतिनिधित्व करता है। एपीएल में, एक जटिल संख्या a+biलिखी जाती हैaJb

  • +.×मैट्रिक्स गुणन। गणितीय रूप से, परिणाम 4 × 1 मैट्रिक्स होगा। हालांकि, +.×एपीएल में "आंतरिक उत्पाद" कहा जाता है जो मैट्रिक्स गुणन और वेक्टर आंतरिक उत्पाद को सामान्य करता है और आपको 2-आयामी वाले के साथ 3-आयामी सरणी "सामान" भी करने की अनुमति देता है। इस मामले में, हम 4 × 2 मैट्रिक्स और 2-तत्व वेक्टर को गुणा कर रहे हैं, जिसके परिणामस्वरूप 4-तत्व वेक्टर (4 दिए गए वर्टिकल की जटिल संख्या प्रतिनिधित्व) है।

  • -⍙ऊपर के रूप में चारों ओर लपेट के साथ जोड़ीदार घटाव है। यह आकृति के 4 पक्षों के वैक्टर (जटिल संख्या के रूप में) देता है। ये वैक्टर "रिवर्स" दिशा में इंगित करते हैं, लेकिन इससे कोई फर्क नहीं पड़ता।

  • x← चर में संग्रहीत करता है x


2|1+-⍙(12○x)÷○1 आकार के 4 कोने पर बाहरी कोणों का प्रतिनिधित्व करता है)।

  • 12○xरेडियन में, 4 साइड वैक्टर में से प्रत्येक में, मुख्य तर्क पाता है ।

  • ÷○1work से विभाजित करता है ताकि कोण के साथ काम करना आसान हो। इस प्रकार, सभी कोणों को एक सीधे कोण के एक बहु के रूप में व्यक्त किया जाता है।

  • -⍙ऊपर बताए अनुसार चारों ओर लपेट के साथ जोड़ीदार घटाव। यह 4 बाहरी कोण देता है।

  • 2|1+ मुख्य तर्क छाया हुआ है (-1,1] और युग्मक घटाव सीमा (-2,2) बनाता है। यह खराब है क्योंकि एक ही कोण में 2 अलग-अलग अभ्यावेदन हैं। "1 मॉड 2 जोड़ें" करके, कोण फिर से है- पर छाया हुआ (0,2)। हालाँकि सभी कोण 1 से अधिक हैं लेकिन यह क्या होना चाहिए, यह ठीक है अगर हम इसे ध्यान में रखते हैं।


|x4 साइड वैक्टर में से प्रत्येक की भयावहता का पता लगाता है


{⍵≡2⌽⍵:≡⍙¨0⍺⍵⋄2 4=+/1=2|+⍙↑⍵(=⍙⍺)}एक फ़ंक्शन को सही तर्क के रूप में 4 बाहरी कोणों के सरणी के साथ और सही तर्क के रूप में 4 पक्ष लंबाई के सरणी के साथ लागू करता है

  • समारोह में एक संरक्षित अभिव्यक्ति है। इस मामले में, ⍵≡2⌽⍵गार्ड है।
  • यदि गार्ड मूल्यांकन करता है 1तो अगली अभिव्यक्ति ≡⍙¨0⍺⍵निष्पादित होती है और उसका मूल्य वापस आ जाता है।
  • यदि गार्ड इसका मूल्यांकन करता है 0, तो उस अभिव्यक्ति को छोड़ दिया जाता है और उसके बाद के 2 4=...=⍙⍺)बजाय निष्पादित किया जाता है।

⍵≡2⌽⍵ जाँच करता है कि क्या विपरीत कोणों के दोनों जोड़े बराबर हैं।

  • 2⌽⍵ कोणों की सरणी को 2 स्थानों से घुमाता है।
  • ⍵≡जाँच करता है कि क्या यह स्वयं के समान है

≡⍙¨0⍺⍵ प्रत्येक समानांतर चतुर्भुज-प्रकार आकार के लिए एक अद्वितीय मान देता है।

  • 0⍺⍵स्केलर का 3-तत्व सरणी 0, साइड लंबाई सरणी , और कोण सरणी है
  • ≡⍙¨≡⍙उन तत्वों में से प्रत्येक के लिए निष्पादित करता है ।
  • ≡⍙जाँचता है कि क्या किसी सरणी के सभी मान जाँच कर के बराबर हैं यदि इसे 1 से घुमाकर समान सरणी देता है। स्केलर इतने ≡⍙0रिटर्न को नहीं घुमाते हैं 1। जैसा कि ऊपर उल्लेख किया गया है, ≡⍙⍺एक रोम्बस के ≡⍙⍵लिए जाँच करता है और एक आयत के लिए जाँच करता है।

2 4=+/1=2|+⍙↑⍵(=⍙⍺)प्रत्येक गैर-समांतर चतुर्भुज-आकार के लिए एक अद्वितीय मान देता है। यह पतंग और ट्रैपेज़ियम के चेक को इंटरवेट करके हासिल किया जाता है।


2=+/1=2|+⍙⍵ एक ट्रेपेज़ियम के लिए जाँच।

  • +⍙⍵आसन्न कोण sums देता है। समानांतर रेखाओं के आंतरिक कोण एक सीधे कोण पर होते हैं, इस प्रकार चतुर्भुज के समानांतर पक्षों के बाहरी कोण होते हैं। तो, समानांतर पक्षों की प्रत्येक जोड़ी को दो 1या -1निकटवर्ती कोणों की ओर ले जाना चाहिए ।

  • 1=2|हालांकि, कोण 1 से अधिक हैं जो उन्हें होना चाहिए, इसलिए कोण वास्तव में 1या के बराबर हैं 3। यह "आधुनिक 2 बराबर 1" द्वारा जांचा जा सकता है।

  • +/सरणी गाया जाता है। यह आसन्न कोण sums की एक गिनती देता है जो है 1या 3

  • 2= जाँच करें कि बराबर है 2. (यानी यदि समानांतर पक्षों की एक जोड़ी हो तो)


4=+/1=2|+⍙(=⍙⍺) एक पतंग के लिए जाँच करता है।

  • (=⍙⍺)यह दर्शाता है कि समीपवर्ती भुजाएँ समान हैं। इसके विपरीत , =तत्व-वार काम करते हैं। इस प्रकार, यह 1एस के साथ एक 4-तत्व सरणी है जहां उस तरफ की लंबाई "अगले" पक्ष के बराबर है।

  • +⍙ चारों ओर लपेट के साथ जोड़ीदार राशि।

  • 1=2|चूंकि (=⍙⍺)एक बूलियन सरणी (केवल 0एस और 1एस के साथ एक ) देता है, जोड़ीदार योग के एकमात्र संभावित मान हैं 0, 1और 2। तो 1=2|बस के रूप में ही है 1=

  • +/सरणी गाया जाता है। यह जोड़ीदार योगों की एक गिनती देता है जो है 1

  • 4=जाँच करें कि अगर 4. अगर एक ही रास्ता ऐसा होता है के बराबर होती है (=⍙⍺)है 1 0 1 0या 0 1 0 1। जैसा कि ऊपर उल्लेख किया गया है, इसका मतलब है कि आकार एक पतंग है।


2 4=+/1=2|+⍙↑⍵(=⍙⍺) उपर्युक्त जाँचों को जोड़ता है।

  • ⍵(=⍙⍺)सरणी और सरणी का 2-तत्व नेस्टेड सरणी है(=⍙⍺)

  • नेस्टेड सरणी को एक उचित मैट्रिक्स को बढ़ावा देता है। चूंकि ⍵(=⍙⍺)4-तत्व सरणियों का 2-तत्व सरणी है, परिणाम 2 × 4 मैट्रिक्स है।

  • +⍙चूंकि (और, विस्तार से ), अंतिम (क्षैतिज) अक्ष को घुमाता है, +⍙मैट्रिक्स के +⍙लिए प्रत्येक पंक्ति को व्यक्तिगत रूप से लागू करने के समान है ।

  • 1=2|दोनों अवशेष / मॉड ( |) और बराबर ( =) प्रति-तत्व के आधार पर, यहां तक ​​कि मेट्रिसेस पर भी काम करता है।

  • +/डिफ़ॉल्ट रूप से, कम ( /) अंतिम (क्षैतिज) अक्ष के साथ काम करता है। तो +/पंक्तियों के साथ बैठते हैं और एक 2 × 4 मैट्रिक्स को 2-तत्व सरल सरणी में बदल देते हैं।

  • 2 4=चूंकि =प्रति-तत्व काम करता है, यह पतंग और ट्रेपेज़ियम की स्थिति की एक साथ जांच करता है।


3

मैथेमेटिका, 195 बाइट्स

Which[s=Differences@{##,#};l=Norm/@s;r=#.#2==#2.#3==0&@@s;Equal@@l,If[r,1,2],#==#3&&#2==#4&@@l,If[r,3,4],MatchQ[l,{a_,b_,b_,a_}|{a_,a_,b_,b_}],5,#+#3=={0,0}||#2+#4=={0,0}&@@Normalize/@s,6,1>0,7]&

व्हॉट्सएप के साथ:

Which[
    s = Differences @ {##,#};
    l = Norm /@ s;
    r = #.#2 == #2.#3 == 0& @@ s;

    Equal @@ l, If[r, 1, 2],
    # == #3 && #2 == #4& @@ l, If[r, 3, 4],
    MatchQ[l, {a_,b_,b_,a_}|{a_,a_,b_,b_}], 5,
    #+#3 == {0,0} || #2+#4 == {0,0}& @@ Normalize /@ s, 6,
    1 > 0, 7
]&

1वर्गों के लिए आउटपुट , 2रम्बी के लिए, 3आयतों के लिए, 4समांतर चतुर्भुज के लिए, 5पतंग के लिए, 6ट्रेपेज़ोइड के लिए, और 7किसी भी चीज़ के लिए। मैं एक TIO लिंक पोस्ट करूँगा, लेकिन यह जाहिरा तौर पर गणित में काम नहीं करता है।

चार अंक हैं P, Q, R, और S, फिर {##,#}रहा है {P,Q,R,S,P}, इसलिए sपक्ष वैक्टर की सूची है {Q-P,R-Q,S-R,P-S}, lउन वैक्टर की लंबाई है, और rहालत यह है कि बीच के कोण Q-Pऔर R-Qसाथ ही बीच के कोण के रूप में R-Qऔर S-Rदोनों कर रहे हैं 90डिग्री कम है।

इस प्रकार, यदि सभी पक्षों की लंबाई समान है, तो चतुर्भुज एक समभुज है। यदि rयह माना जाता है, तो यह वास्तव में एक वर्ग है, अन्यथा यह एक सादा रूप है।

रूम्बी को बाहर निकालते हुए, यदि विपरीत दिशा की लंबाई के दोनों जोड़े समान हैं, तो चतुर्भुज अभी भी समान्तर रेखा है। यदि rयह माना जाता है, तो यह वास्तव में एक आयत है, अन्यथा, यह सिर्फ एक सादे समांतर चतुर्भुज है।

समांतर चतुर्भुज को नियमबद्ध करते हुए, साइड की लंबाई की सूची lफॉर्म {a,b,b,a}या {a,a,b,b}कुछ के लिए है aऔर bफिर, चतुर्भुज एक पतंग है। ध्यान दें कि यह अतिरिक्त रूप से एक समरूप नहीं हो सकता है या यह वास्तव में एक लय हो सकता है।

समानांतर चतुर्भुज और पतंगों पर शासन करना, यदि चतुर्भुज में समानांतर पक्षों की एक जोड़ी है, तो यह एक समलम्ब है। हम इसे Normalizeसाइड वैक्टर द्वारा जाँचते हैं और जाँचते हैं कि क्या विपरीत वैक्टर की एक जोड़ी इसमें जुड़ती है {0,0}

उपरोक्त सभी को खारिज करते हुए, यदि 1 > 0(यह बेहतर हो), तो चतुर्भुज एक सादा पुराना चतुर्भुज है।


1

पायथन 2 , 463 410 408 397 बाइट्स

एक सूची में अनुक्रमित करने के बजाय छठी पंक्ति में एक टपल का उपयोग करके 53 बाइट्स सहेजे गए।

प्रत्येक आकृति के पहले अक्षर के बजाय 7 के माध्यम से आउटपुट पूर्णांक 1 में स्थानांतरित करके 11 बाइट्स सहेजे गए। पूर्णांक इस प्रकार हैं:

  1. वर्ग
  2. आयत
  3. विषमकोण
  4. चतुर्भुज
  5. चतुर्भुज
  6. पतंग
  7. चतुष्कोष
from numpy import *;D=dot
from numpy.linalg import *;N=norm
def P(a,b):x=D(a,b);y=N(a)*N(b);return x==y or x==-y
def Q(a,b):return int(N(a)==N(b))
L=input()
a,b,c,d=tuple([(L[i][0]-L[(i+1)%4][0],L[i][1]-L[(i+1)%4][1]) for i in range(4)])
g=7
e=Q(a,c)+Q(b,d)
if e==2:
 g=(1if D(a,b)==0 else 3) if Q(a,b) else 2 if D(a,b)==0 else 4
elif P(a,c) or P(b,d):
 g = 5
elif Q(a,b) or Q(b,c):
 g = 6
print g

इसे ऑनलाइन आज़माएं!

तर्क दिखाने के लिए अनगढ़

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

तर्क डॉट उत्पादों और चतुर्भुज के पक्षों द्वारा गठित वैक्टर के मानदंड (लंबाई) पर निर्भर करता है, ताकि यह आकलन किया जा सके कि दोनों पक्षों की लंबाई समान है, विपरीत पक्षों पर समानांतर है, या आसन्न पक्षों के लंबवत है।

def S(va, vb):
    return (va[0]-vb[0], va[1]-vb[1])
def dot(sa,sb):      # Eventually replaced with numpy.dot
    return(sa[0]*sb[0]+sa[1]*sb[1])
def norm(s):         # Eventually replaced by numpy.linalg.norm
    return (s[0]**2+s[1]**2)**.5
def isperp(a,b):     # Test if lines/vectors are perpendicular
    return dot(a,b)==0
def ispar(a,b):      # Test if lines/vectors are parallel
    x = dot(a,b)
    y = norm(a)*norm(b)
    return x == y or x == -y
def iseq(a,b):       # Test if lines/vectors are equal in length
    return norm(a)==norm(b)
   
def f(L):
    #Define the four sides
    s = []
    for i in range(4):
        s.append(S(L[i],L[(i+1)%4]))  # I refer often so shorter names may eventually

    guess = 'Q'
    eqsides = 0           # These 6 lines eventually golfed using integer arithmetic by returning an int from iseq()
    if iseq(s[0], s[2]):
        eqsides += 1
    if iseq(s[1],s[3]):
        eqsides += 1
    if eqsides == 2:
    # Opposite sides are equal, so square, rhombus, rectangle or parallelogram
        if iseq(s[0],s[1]):       #Equal adjacent sides, so square or rhombus
            guess='S' if isperp(s[0], s[1]) else 'H'
        else:                     # rectangle or Parallelogram
            guess='R' if isperp(s[0], s[1]) else 'P'
    elif ispar(s[0],s[2]) or ispar(s[1],s[3]):
        guess = 'T'
    elif iseq(s[0],s[1]) or iseq(s[1],s[2]):
        guess = 'K'
    return guess
    

#test suite:
print f([(0, 0), (1, 0), (1, 1), (0, 1)]) # -> square
print f([(0, 0), (1, 1), (-1, 3), (-2, 2)]) # -> rectangle
print f([(0, 0), (5, 0), (8, 4), (3, 4)]) #  -> rhombus
print f([(0, 0), (5, 0), (6, 1), (1, 1)]) #  -> parallelogram
print f([(0, 0), (4, 0), (3, 1), (1, 1)]) # -> trapezoid/trapezium
print f([(0, 0), (1, 1), (0, 3), (-1, 1)]) #-> kite  
print f([(0, 0), (2, 0), (4, 4), (0, 1)]) #-> quadrilateral

इसे ऑनलाइन आज़माएं!


1
[(0, 0), (2, 2), (4, 0), (0,-2)]पतंग के रूप में मिसलीटेड
ट्विनट

क्या यह काम करेगा? repl.it/JRzE
Zacharý

@TwiNight धन्यवाद इस संभावना को नहीं देखा। समस्या यह है कि मेरा प्रारंभिक एल्गोरिथ्म केवल यह देखने के लिए जांचता है कि क्या मिलान लंबाई के पक्षों में से एक जोड़ी है। जैसा कि आप उदाहरण देते हैं, यह पर्याप्त नहीं है। मुझे मिलान किए गए पक्षों में से एक जोड़ी की जांच करनी होगी, और फिर जांच लें कि क्या विपरीत जोड़ी भी लंबाई में समान है। लागू करने के लिए बहुत व्यस्त है।
CCB60

0

बैच, 287 बाइट्स

@set/aa=%3-%1,b=%4-%2,c=%5-%1,d=%6-%2,e=%7-%1,f=%8-%2,g=a*a+b*b,h=(h=c-a)*h+(h=d-b)*h,i=(i=c-e)*i+(i=d-f)*i,j=e*e+f*f,p=!(i-g)+!(j-h),q=!(h-g),r=!(a*e+b*f),k=q+!(j-i)^|!(j-g)+!(h-i),t=!(a*(f-d)-b*(e-c))+!((c-a)*f-(d-b)*e)
@if %p%==2 (echo 1%r%%q%)else if %k%==2 (echo 1)else (echo 1%t%)

बाइनरी में आउटपुट: 1= पतंग, 10= चतुर्भुज, 11= ट्रेपेज़ियम, 100= समांतर चतुर्भुज , 101= Rhombus, 110= आयत, 111= वर्ग। स्पष्टीकरण: g, h, i, jपक्षों की लंबाई के वर्ग हैं। pसमान लंबाई वाली विपरीत भुजाओं के जोड़ों की संख्या है, qसमानांतर युग्मकों / आयतों और rhobmi / वर्गों के rबीच का अंतर यह जाँच कर कि क्या विपरीत जोड़े वास्तव में समान हैं, समानांतर चतुर्भुज / rhombi और आयतों / वर्गों के बीच एक लंबवत जाँच के माध्यम से भिन्न होते हैं, के kलिए जाँच करता है समीपवर्ती पक्षों के जोड़े की तलाश में पतंग और tसमानांतर पक्ष की जाँच के एक जोड़े के माध्यम से एक ट्रेपेज़ियम के लिए जाँच करता है।



@TwiNight बाह, पतंग के लिए जाँच वास्तव में अजीब है।
नील

हाँ, मैं इसे करने के लिए एक कॉम्पैक्ट तरीका खोजने के लिए भाग्यशाली था
ट्विनट

@TwiNight मैं इसके लिए आपका वचन लेता हूँ; एपीएल मेरे लिए पूरी तरह से अपठनीय है।
नील

वह हिस्सा जहां मैं पतंग के लिए जांच करता हूं 2=|-.=⍙⍺। निश्चित रूप से कॉम्पैक्ट दिखता है यदि आप गणना में लगाए गए कार्य (4 पक्ष की लंबाई) और परिभाषित करने के लिए एक पूरी लाइन की
अनदेखी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.