दो त्रिभुजों का अंतर्विरोध


19

2 डी विमानों पर 4 बिंदुओं को देखते हुए A, B, C, D, त्रिभुजों के चौराहे के क्षेत्र की गणना करें OABऔर OCD, जहां Oसमन्वय हो, विमान का केंद्र है (0, 0)

एल्गोरिदम जो निरंतर समय जटिलता (अंकगणितीय संचालन के संदर्भ में) को चलाता है, को प्रोत्साहित किया जाता है, लेकिन मजबूर नहीं।

नियम

  • प्रत्येक बिंदु को दो वास्तविक संख्याओं के रूप में दर्शाया गया है, उनके X और Y समन्वय को दर्शाता है।
    • वैकल्पिक रूप से, यदि आपकी प्रोग्रामिंग भाषा (या आपकी प्रोग्रामिंग भाषा की कुछ लाइब्रेरी) बिल्ट-इन Pointटाइप या समकक्ष है, तो इसे Pointइनपुट के रूप में ऑब्जेक्ट लेने की अनुमति है ।
  • इनपुट को 4 बिंदुओं के रूप में दिया जाता है, प्रारूप में, जिसमें शामिल हैं:
    • 8 निर्देशांक की एक सूची।
    • 4 बिंदुओं की एक सूची, प्रत्येक बिंदु को किसी भी सुविधाजनक प्रारूप में दर्शाया जा सकता है।
    • 2 अंकों की दो सूची।
    • आदि।
  • आप अंकों के विशेष क्रम (काउंटर-क्लॉकवाइज ऑर्डर या क्लॉकवाइज ऑर्डर) को नहीं मान सकते हैं
  • आप यह नहीं मान सकते कि बिंदु Oइनपुट के रूप में पारित किया गया है। दूसरे शब्द में, प्रोग्राम को एक्सट्रूज़न इनपुट को नहीं लेना और उपयोग करना चाहिए।
  • आप यह नहीं मान सकते कि सभी बिंदु अलग-अलग हैं। दूसरे शब्दों में, त्रिकोण पतित हो सकते हैं। आपको उस मामले को भी संभालने की जरूरत है (नीचे परीक्षण मामले देखें)
  • नीचे दिए गए नमूना परीक्षण मामलों की तुलना में पूर्ण या सापेक्ष अंतर कम होना चाहिए ।10-3

मानदंड जीतना

यह , बाइट्स जीत में सबसे छोटा जवाब!

नमूना परीक्षण के मामले

Ax Ay Bx By Cx Cy Dx Dy area

5 1 1 3 -1 0 0 -1 0
5 1 1 3 -1 0 0 0 0
5 1 1 3 0 0 0 0 0
5 1 1 3 3 4 4 -3 4.50418
5 1 1 3 1 2 2 1 1.5
5 1 1 3 -2 5 4 -2 1.74829
5 1 1 3 -2 5 5 4 2.96154
5 1 1 3 3 5 5 4 1.88462
5 1 1 3 3 5 3 1 3.92308
5 1 1 3 3 5 4 -1 5.26619
5 1 1 3 5 1 4 -1 0
5 1 1 3 5 1 1 3 7
1 3 1 3 5 1 1 3 0
1 3 1 3 1 3 1 3 0
4 8 4 -1 -2 6 -2 -3 0

1.2 3.4 -0.3 4.2 5 7.6 -1.1 2.4 2.6210759326188535
3.1 0.6 0.1 7.2 5.2 0.7 0.9 8 9.018496993987977

अगर किसी को चाहिए, यहाँ सटीक रूप में पहले टेस्ट केस समूह के लिए आउटपुट हैं:

0
0
0
46375/10296
3/2
1792/1025
77/26
49/26
51/13
23345/4433
0
7
0
0
0

परीक्षण मामले के लिए चित्रण छवि 5 1 1 3 3 4 4 -3(हरे चतुर्भुज का क्षेत्र अपेक्षित आउटपुट है):

[ छवि]


आपके एक परीक्षण के मामले में 9 के बजाय 8. इनपुट हैं। 1.2 3.4 -0.3 4.2 5 3 7.6 -1.1 2.4 0
केली लोल्डर

1
@ केलीलौड फिक्स्ड।
user202729

जवाबों:


16

वोल्फ्राम भाषा (गणितज्ञ) , 55 बाइट्स

0&@@Area@BooleanRegion[And,Simplex[{0{,}}~Join~#]&/@#]&

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

तुच्छ उत्तर से कुछ बाइट्स काटे।

%@{{{5, 1}, {1, 3}}, {{3, 4}, {4, -3}}} yields 46375/10296 or 4.504176379

के Areaसाथ प्रतिस्थापित DiscretizeRegionचौराहा दिखाएगा।

यहाँ छवि विवरण दर्ज करें

वैसे, यह किसी भी सिम्प्लेक्स के साथ काम करेगा, न कि केवल त्रिकोण।

-1 जुंगहवान मिन को धन्यवाद

@ user202729 के सुझाव में 4 बाइट जोड़े गए, लेकिन यह पतित त्रिकोण के लिए 0 देता है


1
बहुभुज को सिम्प्लेक्स के रूप में अच्छी तरह से प्रतिस्थापित किया जा सकता है
केली लोल्डर

1
एक और बाइट: {{0,0}}टू {0{,}}(यह काम करता है क्योंकि अभिव्यक्ति का मूल्यांकन करता है {Times[0, {Null, Null}]})
जंगम मिन

इस परीक्षण मामले के लिए असफल , जो नमूना परीक्षण मामलों में सूचीबद्ध है।
user202729

पहले से ही उल्लेख किया है कि यह TIO पर काम नहीं करता है। यकीन नहीं है कि वे हुड के नीचे क्या है।
केली लोडर

1
मुझे लगता है कि यह दो लाइनों के प्रतिच्छेदन के लिए काम नहीं करता है। उस टेस्ट केस को स्किप करने के लिए मेरा बुरा। तकनीकी रूप से ये त्रिभुज नहीं हैं। मुझे लगता है कि अगर हम उस तकनीकी को प्राप्त करने जा रहे हैं, तो शायद आपको पद के शीर्षक के साथ-साथ पहले वाक्य को भी बदलना चाहिए। हम इस बात पर भी चर्चा कर सकते हैं कि क्या इस क्षेत्र को एक आयामी वस्तु के लिए भी परिभाषित किया गया है, लेकिन मैं ऐसा नहीं करूंगा।
केली लोल्डर

5

पायथन 2 + पीआईएल, 341 318 313 284 270 बाइट्स

डेनिस के लिए विशेष धन्यवाद जिसने श्री Xcoder के लिए TIO -23 बाइट्स पर तुरंत जनहित याचिका को जोड़ा

import PIL.Image as I,PIL.ImageDraw as D
l=[i*1000for i in[0,0]+input()+[0,0]]
z=zip(*[[i-min(t)for i in t]for t in l[::2],l[1::2]])
print sum(map(int.__mul__,*map(lambda i,c:D.Draw(i).polygon(c,1)or i.getdata(),map(I.new,'11',[[max(l)-min(l)]*2]*2),[z[:3],z[3:]])))/1e6

इसे ऑनलाइन आज़माएं! या सभी परीक्षण मामलों का प्रयास करें

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

व्याख्या

#the image/triangles are enlarged to increase the precision
#a pair of zeros are inserted in the start and at the end, this way "l" will have all 6 points to draw the triangles 
l=[i*1000for i in[0,0]+input()+[0,0]]
#split the input in x and y, where x=l[::2] and y=l[1::2]
#get the smallest number on each list, that will be "0" if there is no negative number, to be used as offset.
#this will be used to overcome the fact that PIL won't draw on negative coords
#zip "x" and "y" lists, to create a list containing the points
z=zip(*[[i-min(t)for i in t]for t in x,y])
#create 2 (B&W) blank images
#where the size is the difference between the smallest and the largest coord.
map(I.new,'11',[[max(l)-min(l)]*2]*2)
#draw both triangles and return the pixel list of each image
map(lambda i,c:D.Draw(i).polygon(c,1)or i.getdata(),<result of previous line>,[z[:3],z[3:]])
#count the amount of overlapping pixels by summing the color of each pixel, if the pixel is "1" in both images, then the triangles are overlapping, then the amount of pixels is divided by the initial enlarging factor squared (1e6)
print sum(map(int.__mul__,*<result of previous line>))/1e6
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.