आयताकार अंतर


20

इस चुनौती में, आपको दो ओवरलैपिंग आयताकार दिए जाते हैं, और आपको एक से दूसरे को हटाकर बनाई गई आयतों की गणना करने की आवश्यकता होती है।

उदाहरण के लिए, यदि आप काले रंग से लाल आयत को हटाते हैं:

आयतों

आप निम्नलिखित दो आयत सेटों में से एक को समाप्त करते हैं:

विभाजन एक विभाजन दो

आपको निम्नलिखित को भी संभालना होगा:

सभी परीक्षण मामले

अधिक स्पष्ट होना:

  • आप दो आयतों, ए और बी के निर्देशांक को इनपुट करेंगे।
  • आपको कुछ गैर-अतिव्यापी आयतों को आउटपुट करने की आवश्यकता है जो ए के सभी क्षेत्रों को बी के बिना कवर करते हैं। किसी भी संभावित कवर की अनुमति है
  • आयताकार निर्देशांक 4 पूर्णांक के रूप में पारित किए जाते हैं। आप उन्हें दो जोड़े (दो कोने के बिंदुओं का प्रतिनिधित्व) में, या 4 पूर्णांक की एक ट्यूपल / सूची के रूप में पास कर सकते हैं। आपके इनपुट और आउटपुट को लगातार होना चाहिए।
  • ए और बी जरूरी ओवरलैप या स्पर्श नहीं करेंगे, और प्रत्येक में कम से कम 1 का क्षेत्र होगा

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

[(0 0) (5 5)] [(3 4) (8 7)]   -> [(0 0) (5 4)] [(0 4) (3 5)] # or [(0 0) (3 5)] [(3 0) (5 4)]
[(2 4) (10 11)] [(5 5) (6 6)]  -> [(2 4) (10 5)] [(2 5) (5 6)] [(6 5) (10 6)] [(2 6) (10 11)]    #Other sets of 4 rectangles are possible
[(3 3) (8 8)] [(0 1) (10 8)]   ->    #No rectangles should be output
[(0 0) (5 5)] [(1 1) (10 2)]   -> [(0 0) (1 5)] [(1 0) (2 1)] [(2 0) (5 5)]  #Other sets of 3 rectangles are possible
[(1 5) (7 8)] [(0 0) (1 10)]   -> [(1 5) (7 8)]  #Only possible output
[(4 1) (10 9)] [(2 5) (20 7)]   -> [(4 1) (10 5)] [(4 7) (10 9)]  #Only possible output
[(1 1) (8 8)] [(0 6) (9 9)]     -> [(1 1) (8 6)]   #Only possible output

यह एक , इसलिए अपने कोड को यथासंभव छोटा बनाएं!



1
क्या हम मान सकते हैं कि दिया गया इनपुट {(x1, y1), (x2, y2)}होल्ड है x1 < x2और y1 < y2?
tsh

हां। आयत में 1 का क्षेत्र होगा, और आप किसी भी क्रम में निर्देशांक को पसंद कर सकते हैं।
नाथन मेरिल

क्या किनारा मोटा है? जब आयत को परिभाषित किया जाता है तो किनारे को शामिल किया जाता है?
Julвгений Новиков

किनारे में 0 मोटाई है।
नाथन मेरिल

जवाबों:


3

पायथन 2 , 375 360 345 343 बाइट्स

from itertools import*;P=product
def f(S,M):(l,t),(r,b)=S;(L,T),(R,B)=M;u,v,x,y=(L>=r)+(l<L),(T>=b)+(t<T),(R>=r)+(l<R),(B>=b)+(t<B);return[S]if v==y!=1or u==x!=1else[list(p(p(*zip(*(S+M))),repeat=2))[[43,197,6,199,9,231,142,229,53,189,134,181][int(i,36)]]for i in '38,491,258,2058,8,4B,28,208,7,41,27,461,,4,2,4A'.split(',')[u+2*v+4*x+8*y-12]]

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

EDITS: -15 @notjagan के सुझावों से; एक और -15 समाधान के सरणी को फिर से एन्कोडिंग द्वारा int36 प्रारूप और एक छोटी लुकअप तालिका; @musicman के अनुसार पी के साथ उत्पाद की जगह एक और -2।

एक फ़ंक्शन जो दो आयताकार लेता है, प्रत्येक रेक्टल ((बाएं, शीर्ष), (दाएं, नीचे) का टपल हो रहा है; परिणामी आयतों की सूची लौटाता है।

मूल रणनीति:

     |     |
 0,0 | 1,0 | 2,0
-----A-----+-----
     |     |
 0,1 | 1,1 | 2,1
-----+-----B-----
     |     |
 0,2 | 1,2 | 2,2
     |     |

उपरोक्त आरेख में, 'स्रोत' आयत (पहली आयत) के अंक A और B क्रमशः ऊपरी बाएँ और निचले दाएँ हैं।

हम उस ग्रिड में 'मास्क' आयत के ऊपरी बाएँ (u,v)और निचले दाईं ओर प्रत्येक के प्लेसमेंट को पाते हैं (x,y)

यदि ये दोनों बिंदु पहले या अंतिम कॉलम में हैं; या पहली या अंतिम पंक्ति; फिर ओवरलैप नहीं है; और हम सिर्फ स्रोत की परत वापस कर सकते हैं।

अन्यथा, 16 मामले शेष हैं; उदाहरण के लिए, ओपी का पहला उदाहरण वह मामला है जिसे हम लेबल कर सकते हैं (1,1),(2,2)। प्रत्येक मामले को परिणामस्वरूप आयतों के एक सेट पर मैप किया जा सकता है, जिनके कोने हमेशा बाएँ, दाएँ, या मास्क आयतों में क्षैतिज मानों के साथ तालमेल रखते हैं, बाएँ, दाएँ; और इसी तरह ऊर्ध्वाधर मूल्यों के लिए, स्रोत के ऊपर, नीचे या मास्क।

उदाहरण के लिए, के लिए (1,1),(2,2)मामले, आयत होगा ((l,t),(T,r))और ((l,T),(R,b)), जहां l,t,r,bऔर L,T,R,B, छोड़ दिया जाता है शीर्ष, सही और स्रोत के नीचे और क्रमशः आयतों मास्क,।

तो हम एक लुकअप टेबल बना सकते हैं जो निर्देशांक को ऐसे सभी संभावित संयोजनों के सेट को मैप करता है (जो कि product(product(*zip(*)))बिट के बारे में है) आयतों के एक सेट के लिए जो प्रत्येक मामले के लिए प्रदान किया जाना चाहिए (जो, कुछ गोल्फ-अपघटन के बाद) , क्या बाकी सूची सामान के बारे में है)।


-15 बाइट्स में विभिन्न गोल्फ सुधार करके , या -18 बाइट्स पायथन में स्ट्रिंग्स का उपयोग करके 3.
नॉटजैगन

आप दो और बाइट्स को स्निप कर सकते हैं p=productऔर उनके स्थान product(productपरp(p
musicman523

3

जावास्क्रिप्ट, 115 बाइट्स

f=a=>b=>b.some((n,i)=>(a[i^2]<n)^i/2)?[a]:b.map((n,i)=>a[i&1]<n&&n<a[i|2]&&(p=[...a],p[i^2]=a[i]=n,p)).filter(x=>x)

अतिव्यापी संस्करण:

f=a=>b=>b.some((n,i)=>(a[i^2]<n)^i/2)?[a]:b.map((n,i)=>a[i&1]<n&&n<a[i|2]&&(p=[...a],p[i^2]=n,p)).filter(x=>x)

निम्नलिखित प्रारूप में इनपुट: f([1,1,8,8])([0,6,9,9])


इनपुट इनपुट के रूप में ((X1, y1), (x2, y2)), (x3, y3), (x4, y4))

यदि निम्न में से कोई भी एक शर्त पूरी होती है, तो पहले आयत को इस रूप में लौटाएँ:

  • x3> x2
  • x4 <एक्स 1
  • y3> y2
  • y4 <y1

अन्यथा

  • यदि X1 <x3 <x2 तो हम एक आयत ((X1, y1), (x3, y2)) उत्पन्न करते हैं; और X1 सेट करें: = x3
  • यदि X1 <x4 <x2 तो हम एक आयत ((x4, y1), (x2, y2)) उत्पन्न करते हैं; और x2 सेट करें: = x4
  • यदि y1 <y3 <y2 तो हम एक आयत उत्पन्न करते हैं ((X1, y1), (x2, y3)); और y1 सेट करें: = y3
  • यदि y1 <y4 <y2 तो हम एक आयत ((X1, y4), (x2, y2)) उत्पन्न करते हैं; और y2 सेट करें: = y4

यह एक आशाजनक दृष्टिकोण है; लेकिन यह वर्तमान में कभी-कभी विफल रहता है, उदाहरण के लिए, जब मास्क आयत का स्रोत आयत के साथ कोई ओवरलैप नहीं होता है; उदाहरण के लिए f([0, 30, 10, 40])([5, 1, 6, 2])लौटना चाहिए, [[0, 30, 10, 40]]लेकिन बदले में[[0,30,5,40],[6,30,10,40]]
चास ब्राउन

@NathanMerrill ठीक है, संपादित किया गया।
tsh

@ अंश अच्छा लग रहा है!
नाथन मेरिल

1

जावा, 268 बाइट्स

class W{public static void main(String[]z) {int a[]={0,0,0,0},i,j,y[]={0,1,4,3,6,1,2,3,4,1,6,5,4,7,6,3};for(i=0;i<4;i+=1){for(j=0;j<4;j+=1){a[j]=Integer.parseInt(z[y[i*4+j]]);}if(a[0]<a[2] && a[1]<a[3]){for(j=0;j<4;j+=1){System.out.println(String.valueOf(a[j]));}}}}}

Ungolfed

class W{
    public static void main(String[]z) {
        int a[]={0,0,0,0},i,j,y[]={0,1,4,3,6,1,2,3,4,1,6,5,4,7,6,3};

        for(i=0;i<4;i+=1){
            for(j=0;j<4;j+=1){
                a[j]=Integer.parseInt(z[y[i*4+j]]);
            }
            if(a[0]<a[2] && a[1]<a[3]){
                for(j=0;j<4;j+=1){
                    System.out.println(String.valueOf(a[j]));
                }
            }
        }
    }
}

तर्कों के रूप में इनपुट पास करें। उदाहरण

java -jar W.jar 0 0 5 5 3 4 8 7

0

पायथन 2 , 272 बाइट्स

lambda((a,b),(c,d)),((e,f),(g,h)):[([([[(a,b),(e,min(h,d))]]+[[(g,max(b,f)),(c,d)]]*2+[[(max(a,e),b),(c,f)]]*4+[[(a,h),(min(c,g),d)]])[m-1]for m in M&{1,2,4,8}]if M&{0}else[(a,b),(c,d)])for M in[{(x<e)*1+(x>g)*2+(y<f)*4+(y>h)*8 for x in range(a,c)for y in range(b,d)}]][0]

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

यह पहली सेल के अंदर हर सेल के परीक्षण के लिए काम करता है बाएं = 1, वाचा = 4, अधिकार = 2, और विदूषक = 8 डब्ल्यू / आर से दूसरे तक, और परिणाम का। यदि दूसरा पहले के साथ = 0 को इंटरसेक्ट नहीं करता है, तो मूल वापस आ जाता है, अन्यथा ओवरलैप के लिए आवास के साथ एक बाएं स्लाइस, राइट स्लाइस, अपर स्लाइस और लोअर स्लाइस का कुछ संयोजन वापस आ जाता है।

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