पथ-खंड की तरह; पहली बार देखा


14

2 या अधिक 2D कार्टेशियन बिंदुओं की एक आदेशित सूची को देखते हुए, एक सत्य मान का उत्पादन करें यदि या तो पथ स्वयं या स्वयं-अंतर को छूता है; अन्यथा एक मिथ्या मूल्य का उत्पादन अगर यह स्वयं या आत्म-प्रतिच्छेद को नहीं छूता है।

आप मान सकते हैं कि सूची में लगातार अंक अलग हैं।

उदाहरण:

(0,0), (1,0) -> falsey
(0,0), (1,0), (0,0) -> truthy
(0,0), (1,0), (1,1), (0,0) -> truthy
(0,0), (2,0), (1,1), (1,-1) -> truthy
(0,0), (10,0), (0,1), (10,1), (0,2), (10,2) -> falsey

ध्यान दें कि मैंने यहां दिए गए सभी निर्देशांक पूर्णांक हैं। आप {पूर्णांक, दशमलव, तर्कसंगत, फ़्लोटिंग-पॉइंट, ...} में से जो कुछ भी पसंद करते हैं, उसके समन्वय का समर्थन कर सकते हैं। लेकिन आपके कार्यान्वयन की गणना को दिए गए किसी भी इनपुट के लिए सही उत्तर देना होगा।


4
क्या एक अच्छा शीर्षक ए +
undergroundmonorail

जलाशय कुत्तों का प्रारंभिक दृश्य , कोई भी?
लुइस मेन्डो

अगर मैं गलत समझ रहा हूं तो मुझे माफ कर दीजिए लेकिन आखिरी टेस्ट का मामला गैर-अंतरविरोधी कैसे है? i.imgur.com/wiNMByd.png
पूरी तरह से

2
@icrieverytim यह एक बंद चलना नहीं है। अंतिम बिंदु पहले से नहीं जुड़ता है।
हाइपरएन्यूट्रीनो

जवाबों:


5

पायथन 2 , 315 309 298 382 380 372 बाइट्स

s=sorted
w=lambda(x,y),(X,Y),(z,w):(X-x)*(w-y)-(z-x)*(Y-y)
def I(a,b):p,q=s(a);P,Q=s(b);n,N,m,M=w(p,q,P),w(p,q,Q),w(P,Q,p),w(P,Q,q);return(q>=P)*(Q>=p)if{n,N,m,M}=={0}else(b[1]!=a[0])*(n*N<=0>=m*M)
def f(l):
 i=0
 while i<len(l)-2:
	x=l[i:i+3];i+=1
	if w(*x)==0and s(x)==x:l.pop(i);i-=1
 L=zip(l,l[1:]);return any(I(*l)for l in[(k,x)for i,k in enumerate(L)for x in L[:i]])

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

यहां से एल्गोरिथ्म का उपयोग करता है , कोलिन सेगमेंट के लिए इस एसओ उत्तर के साथ संयुक्त ।

संपादित करें: (0,0),(1,0),(2,0)मध्य बिंदु को हटाकर (उसी के परिणामस्वरूप) एक ही दिशा (जैसे ) में जारी रहने वाले लाइन खंडों के लिए निश्चित (0,0),(2,0)


आप एक ही टैब के साथ दो रिक्त स्थान की सभी दो घटनाओं को प्रतिस्थापित करके दो बाइट्स बचा सकते हैं।
जोनाथन फ्रीच

*((n*N>0)+(m*M>0)<1)-> *(n*N<=0>=m*M)
जोनाथन फ्रेच

3

यूक्लाइड्स , 154 148 बाइट्स

number i (set p)
g=card(p);h=g;n=0;e=p[0];q=e.e
for d in p
if h<g-1 
q=q.e
n=card(intersection(d.e,q))>1or d on q?1|n
end
e=d;h=h-1
end;return n;end

फंक्शन नाम दिया गया है iकि, अंकों का एक सेट पारित किया, 0 या 1. अर्धविराम और लाइन ब्रेक एक कमांड को समाप्त करने के लिए विनिमेय हैं, मैंने कोड को संक्षिप्त रूप से रखने के लिए कुछ चीजों को एक साथ जोड़ दिया क्योंकि हम सुपाठ्य नहीं हैं। कोड के आसपास यहाँ वैसे भी।

यूक्लीड्स मुख्य रूप से ग्राफिकल आउटपुट के लिए एक प्लेन ज्योमेट्री लैंग्वेज है, लेकिन साथ ही साथ अच्छी प्रोग्रामेटिक क्षमताओं के साथ। मैंने सोचा कि यह इस कार्य के लिए बहुत अच्छा होगा, लेकिन कुछ चीजों ने मुझे निराश किया। सबसे पहले, यह ध्यान देने योग्य है कि यूक्लाइड्स में सेट अनिवार्य रूप से बिंदुओं के एरे हैं, और जब लागू होते हैं तो कनेक्टेड लाइन सेगमेंट से बने पथ के रूप में प्रदान किए जाते हैं। Eukleides लोकी के माध्यम से सेट की पुनरावृत्त पीढ़ी का समर्थन करता है, जो कि इस प्रक्रिया में एक सेट बनाता है, एक लूप के समान है। अगर मैं एक लोको का उपयोग करने में सक्षम था, तो यह बाइट्स से मुंडा होता, लेकिन जाहिर तौर पर यूक्लिड्स अपने भीतर से आंशिक रूप से बने हुए स्थान का संदर्भ देना पसंद नहीं करता।

अन्य प्रमुख हताशा यह थी कि यदि, प्रतीत होता है, दो समान रेखा खंड एक-दूसरे के ऊपर हैं, तो intersectionकेवल एक आवर्ती बिंदु (जो समझ में आता है, मुझे लगता है, अनंत चौराहे होंगे)। मेरी विधि अनिवार्य रूप से पथ को एक कदम पीछे बनाने के लिए है, और पथ के साथ चौराहों के लिए अगली पंक्ति खंड का परीक्षण करें। पूर्वोक्त चौराहे के व्यवहार के कारण मैं अलग से जाँच करता हूँ कि बिंदु पथ पर है या नहीं ।

संपादित करें : orपहले एक स्थान को हटाने के लिए अनुमति देने के लिए बयान को फिर से दर्ज करके 1 बाइट काट लें or; उस ifब्लॉक को टर्नरी ऑपरेशन में बदलकर 5 और बाइट्स ।

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

ta=point(0,0).point(1,0)
tb=point(0,0).point(1,0).point(0,0)
tc=point(0,0).point(1,0).point(1,1).point(0,0)
td=point(0,0).point(2,0).point(1,1).point(1,-1)
te=point(0,0).point(10,0).point(0,1).point(10,1).point(0,2).point(10,2)
print i(ta);print i(tb);print i(tc);print i(td);print i(te)

0
1
1
1
0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.