निर्धारित करें कि क्या बहुभुज उत्तल है


21

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

उदाहरण 1

इनपुट

4
0 0
0 1
1 1
1 0

उत्पादन

convex

उदाहरण 2

इनपुट

4
0 0
2 1
1 0
2 -1

उत्पादन

concave

उदाहरण 3

इनपुट

8
0 0
0 1
0 2
1 2
2 2
2 1
2 0
1 0

उत्पादन

convex

x और y पूर्णांक हैं, N <1000 , और | x | | | y | <1000 । आप मान सकते हैं कि इनपुट बहुभुज सरल है (किनारों में से कोई भी पार नहीं करता है, केवल 2 किनारे प्रत्येक शीर्ष को छूते हैं)। सबसे छोटा कार्यक्रम जीतता है।


"सरल" में शामिल नहीं है "लगातार किनारों गैर-कोलीनियर हैं"! इसके अलावा, कुछ और परीक्षण-मामले: (0,0) (0,2) (2,2) (2,0) (1,1); और (1,1) (0,0) (0,2) (2,2) (2,0) - उन मामलों का परीक्षण करने के लिए जहां अवतल शीर्ष को खोजने के लिए अंत से शुरू होने तक लपेटने की आवश्यकता होती है।
पीटर टेलर

यह सवाल उम्र बढ़ने का है, लेकिन ... दो संरेखित खंडों के साथ एक अवतल उदाहरण जोड़ने पर विचार करें, उदाहरण 2 का एक संशोधन (0,0), (2,1), (4,2), (1,0) ( 2, -1)। मैं इसे ऊपर लाता हूं क्योंकि मैंने इसे बिना साकार किए उदाहरण 3 के आसपास फैंक दिया।
जेसी मिलिकन

जवाबों:


4

जे, १०५

echo>('concave';'convex'){~1=#=(o.1)([:>-.~)(o.2)|3([:-/12 o.-@-/@}.,-/@}:)\(,2&{.)j./"1}.0&".;._2(1!:1)3

उपरोक्त तीनों टेस्ट पास करता है।

संपादित करें: (111-> 115) पी के कोण को समाप्त करके सह-रेखीय अंक। कहीं और कुछ अक्षर दिए।

संपादित करें: (115-> 105) कम गूंगा।

J- क्षीण के लिए स्पष्टीकरण:

  • (1!:1)3EOF को STDIN पढ़ें। (मुझे लगता है।)
  • 0&".;._2 इस तरह के इनपुट को पार्स करने के लिए एक अच्छा मुहावरा है।
  • j./"1}. इनपुट की पहली पंक्ति (एन 0) बंद करें और जोड़े को परिसरों में बदलें।
  • (,2&{.) सूची के अंत में पहले दो बिंदुओं से निपटें।
  • 3(f)\ लंबाई 3 (कोण के लिए 3 अंक) की स्लाइडिंग के लिए लागू होता है
  • [:-/12 o.-@-/@}.,-/@}: एक क्रिया है जो प्रत्येक 3 बिंदुओं को -pi और pi के बीच के कोण में बदल देती है।
    • -@-/@}.,-/@}:पैदा करता है (p1 - P2), (p3 - P2)। (याद रखें कि ये कॉम्प्लेक्स हैं।)
    • 12 o. प्रत्येक परिसर के लिए एक कोण देता है।
    • [:-/(...) दो कोणों का अंतर देता है।
  • (o.1)([:>-.~)(o.2)| mod 2 pi, pi (स्ट्रेट सेगमेंट) के एंगल्स को खत्म करते हैं, और pi की तुलना (अधिक से कम, इससे कोई फर्क नहीं पड़ता, जब तक कि पॉइंट्स को एक दिशा में घाव नहीं माना जाता)।
  • 1=#= अगर उन सभी की तुलना 1 या 0 हो (आत्म-वर्गीकरण के साथ। यह गूंगा लगता है।)
  • echo>('concave';'convex'){~ प्रिंट उत्तल।

3

पायथन - 149 वर्ण

p=[map(int,raw_input().split())for i in[0]*input()]*2
print'ccoonncvaevxe'[all((a-c)*(d-f)<=(b-d)*(c-e)for(a,b),(c,d),(e,f)in zip(p,p[1:],p[2:]))::2]

मुझे लगता है कि आपको <= की आवश्यकता है, उदाहरण 3 देखें मैंने अभी जोड़ा है।
कीथ रान्डेल

1
लानत है, कि टुकड़ा ...
st0le

2

रूबी 1.9, 147 133 130 124 123

gets
puts ($<.map{|s|s.split.map &:to_i}*2).each_cons(3).any?{|(a,b),(c,d),(e,f)|(e-c)*(d-b)<(d-f)*(a-c)}?:concave: :convex

1

scala: 297 वर्ण

object C{class D(val x:Int,val y:Int)
def k(a:D,b:D,c:D)=(b.y-a.y)*(c.x-b.x)>=(c.y-b.y)*(b.x-a.x) 
def main(a:Array[String]){val s=new java.util.Scanner(System.in)
def n=s.nextInt
val d=for(x<-1 to n)yield{new D(n,n)}print((true/:(d:+d.head).sliding(3,1).toList)((b,t)=>b&&k(t(0),t(1),t(2))))}}

1
आप def main(a:...इसके बजाय का उपयोग करके तीन वर्णों की दाढ़ी कर सकते हैं def main(args:...
गारेथ

हां, मैंने खुद पर ध्यान दिया, लेकिन 299 से 149 मुझे किसी और के क्षेत्र में नहीं लाते। शायद अगर मुझे अन्य सुधार मिलते हैं - आह, एक है: n एक फ़ंक्शन नाम (अगला) और एक चर नाम है।
उपयोगकर्ता अज्ञात
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.