एक अबाधित आयत निकालें


20

यह चित्र एक दूसरे के शीर्ष पर 7 अलग-अलग रंग की आयतों को ओवरले करके बनाया गया था:

मुख्य छवि

काले और मैरून आयताकार अबाधित हैं , अर्थात् कोई अन्य आयत उनके ऊपर नहीं है।

इस तरह के रूप में एक छवि में एक कार्यक्रम लिखें और परिणामी छवि को आउटपुट करते हुए किसी भी एकल अबाधित आयत को हटा दें।

उदाहरण

यदि आप ऊपर दिए गए चित्र पर अपना प्रोग्राम चलाते हैं और इसे आउटपुट पर फिर से चलाते हैं, तो यह इस तरह से प्रगति कर सकता है।

रन 1 - ब्लैक हटाया (मैरून हो सकता था):

1 चलाएं

रन 2 - मरून हटाए गए (केवल विकल्प):

भागना २

रन 3 - पीला हटा (केवल विकल्प):

दौड़ना ३

रन 4 - नीला हटा (हरा हो सकता था):

दौड़ना ४

रन 5 - हरा हटाया (केवल विकल्प):

दौड़ना ५

रन 6 - ब्राउन हटा (केवल विकल्प):

दौड़ना ६

रन 7 - लाल हटाया (केवल विकल्प):

दौड़ना 7

किसी भी अतिरिक्त रन को समान सफेद छवि का उत्पादन करना चाहिए।

उम्मीद है कि स्टैक एक्सचेंज ने इनमें से किसी भी चित्र को हानिप्रद नहीं किया है।

छवि में हमेशा एक सफेद पृष्ठभूमि होगी और प्रत्येक आयत एक अद्वितीय RGB रंग होगा जो सफेद नहीं है।

आप मान सकते हैं कि छवि को हमेशा अतिव्यापी आयतों के एक सेट के रूप में व्याख्या किया जा सकता है। विशेष रूप से, आप यह मान सकते हैं कि, किसी विशेष रंग के लिए, उस रंग के चित्र के शीर्ष के निकटतम पिक्सेल उस रंग की आयत के शीर्ष किनारे का हिस्सा है। वही नीचे, बाएँ और दाएँ किनारों के लिए धारण करता है।

इसलिए, उदाहरण के लिए, इस छवि में, लाल आयत का ऊपरी किनारा पीले आयत के निचले किनारे से नीचे होगा, क्योंकि नारंगी आयत पुराने लाल शीर्ष किनारे को कवर करती है:

उदाहरण 1

इस छवि में, लाल आयत को पहले (काले / मैरून / नारंगी / ग्रे के साथ) हटाया जा सकता है:

उदाहरण 2

जब निचले आयतों का क्रम अस्पष्ट होता है, तो आप उन्हें कोई भी आदेश दे सकते हैं।

उदाहरण के लिए, यहां बाईं छवि मध्य या दाएं बन सकती है:

उदाहरण 3 उदाहरण 4 उदाहरण 5

आउटपुट में विरोधाभास ओवरलैप नहीं होना चाहिए (इसलिए चित्रकार के एल्गोरिदम के साथ इसे बनाना संभव होना चाहिए)। तो इस छवि में ( धन्यवाद user23013 ), इसे नारंगी आयत के नीचे हरा होना होगा:

उदाहरण 6

अतिरिक्त जानकारिया

  • छवि और आयतों का कोई भी आयाम हो सकता है।
  • आयतें छवि सीमा को छू सकती हैं।
  • 256 3 - 1 आयताकार तक हो सकते हैं।
  • यदि इनपुट पूरी तरह से सफेद है, तो आउटपुट भी होना चाहिए।
  • आप छवि पुस्तकालयों का उपयोग कर सकते हैं।
  • इनपुट छवि फ़ाइल नाम या कच्ची छवि डेटा होना चाहिए। यह स्टडिन या कमांड लाइन से आ सकता है।
  • आउटपुट को एक ही या किसी अन्य छवि फ़ाइल में लिखा जा सकता है, जिसे स्टडआउट में कच्ची, या बस प्रदर्शित किया जाता है।
  • किसी भी सामान्य दोषरहित ट्रूकलर छवि फ़ाइल प्रारूप की अनुमति है।

सबसे कम बाइट्स के साथ सबमिशन जीत जाता है।



तकनीकी रूप से आवश्यकताओं में ऐसा कुछ भी नहीं है जो कहता है कि उत्पादन में विरोधाभास नहीं हो सकता है। क्या इसे जोड़ा जाना चाहिए, या दोनों परीक्षण मामले की व्याख्या ठीक है?
जॉन ड्वोरक

क्या आप कृपया "ट्रूकॉलर" को स्पष्ट कर सकते हैं?
फ़ूजज़नल


@JanDvorak मुझे उम्मीद थी कि निहित था लेकिन, आप सही हैं, यह अस्पष्ट है, इसलिए मैंने इसके बारे में एक नोट जोड़ा है।
केल्विन के शौक

जवाबों:


10

सीजेम, 241 बाइट्स

(हटाए गए नए समाचारों के साथ)

rri:Hri:Vri:Q[q~]3/_Qa3*a+_|$W%:Pf{\a#}:AH/:B0ff*
P,,[AHAW%HBz:+_W%V\V]2/
ff{~@@f=/::|1#}0Ua4*t:R;
P0f<
V{H{BI=J=_2$=
0R{"I>! I+V<J>! J+H<"4/+4/z{~~}%:&1$*\)}%);2$-|t
}fJ}fI
[P,{_La#\1$0t1$f-}*;;]
{:TR=2/~\~V\-,>\f{\_3$=@~H\-,>{Tt}/t}~}/
:~Pf=:~
~]S*N

यह पीपीएम फ़ाइल प्रारूप का उपयोग करता है। उदाहरण का उपयोग (ImageMagick का उपयोग करके):

convert IVYvE.png -compress none ppm:-| (time /path/to/cjam-0.6.4.jar 1.cjam) |display

खैर, यह बहुत लंबा है और बहुत धीमा है ... उदाहरण के लिए लगभग एक मिनट चलता है।

मैंने परीक्षण के मामलों का आकार बदल दिया (और कुछ अन्य को जोड़ा) ताकि परीक्षण आसान हो सके।

ऐसा लगता है कि रंग का स्थान खो गया है इसलिए रंग थोड़े अलग हैं।


2

पायथन, 690 651 610 606 594 569 बाइट्स

स्क्रिप्ट स्टड से छवि का नाम पढ़ती है।

यह हर आयतों के किनारों का पता लगाता है, उन्हें अलग-अलग रंगों की संख्या के अनुसार क्रमबद्ध करता है (अबाधित आयतों में केवल 1 रंग होता है, और फिर सूची के अंत में दिखाई देते हैं)

इस सूची का उपयोग किसी छवि को फिर से बनाने के लिए किया जाता है। Redraw ऑर्डर उस सूची के क्रमबद्धता को चुनकर तय किया जाता है जो आउटपुट इमेज उत्पन्न करेगी जिसमें इनपुट के साथ कम से कम पिक्सेल अंतर हो।

PIL आयात छवि से l के रूप में, ImageDraw से D के रूप में; itertools से आयात *; O, R, I, Z, k = [], श्रेणी, l.open (raw_input ()), {}, lambda x: -x [1 ]; (डब्ल्यू, एच), क्यू = I.size, I.load ()
i, j में उत्पाद (R (W), R (H)):
 c = क्यू [i, j]
 अगर c में z: x, y, X, Y = Z [c]; z [c] = [x, y, मैक्स (X, i), अधिकतम (Y, j)]
 बाकी: जेड [सी] = [i, j, 0,0]
n के लिए क्रमपरिवर्तन (क्रमबद्ध ([(c, len ({Q [g] in g) उत्पाद में (R (x, X), R (y, Y))}) के लिए c, (x, y, X,) Y) में Z.items (), कुंजी = k) [1: -1]): o = l.new (I.mode, I.size, 0xFFFFFF); [D.Draw (o) .rectangle (Z) [c], c, _ के लिए, n में] n =; O + = [(o, sum (abs (ab)) के लिए t, T के लिए zip (I.getdata (), o.getdata ()) a के लिए बी जिप में (टी, टी))]]
अधिकतम (ओ, कुंजी = ट) [0] .show ()

0

जावा - 1483 बाइट्स

मैं एक महान कोड गोल्फर नहीं हूं, जो स्पष्ट हो; इसलिए क्रिया पूरी तरह से जावा की गलती नहीं है;; फिर भी, यह वास्तव में एक मजेदार चुनौती थी। मैंने इसे इस तरह से हल किया है कि - मुझे लगता है - थोड़ा उबाऊ और क्रिया है, लेकिन हे। यह काम करता है, यह (अपेक्षाकृत) तेज है और, विशेष रूप से, यह मजेदार था!

यह विचार निम्नानुसार है: प्रत्येक पिक्सेल को ऊपर बाएं कोने से शुरू करके दाईं ओर नीचे की ओर देखें। क्या यह एक सफेद पिक्सेल है? नज़रअंदाज़ करना। क्या यह रंगीन है? कूल, चलो इसका ट्रैक रखें और इसकी सीमाओं (शीर्ष बाएं, ऊपर दाएं, नीचे बाएं, नीचे दाएं) को निर्धारित करने का प्रयास करें।

एक बार ऐसा करने के बाद, प्रत्येक आयत के क्षेत्र की जाँच करें। क्या इसमें आयत के रंग की तुलना में एक अलग रंग है? फिर पता करें कि आयत उस रंग से संबंधित है और अद्यतन करें कि आयत के z-index को 1 से ओवरलैप करना है।

और अंत में, z- सूचकांकों को ध्यान में रखते हुए सभी आयतों को खींचें। यह वास्तव में एक सी-इंडेक्स की तरह काम करता है जिसे आप सीएसएस और अन्य 3 डी सामान से जानते हैं। सबसे कम जेड-इंडेक्स वाले आयताकार पहले खींचे जाते हैं, उच्चतम जेड-इंडेक्स अंतिम।

import java.awt.*;import java.awt.image.*;import java.io.File;import java.util.*;import java.util.List;import javax.imageio.*;class A{class R{public Color k=new Color(-1);public int z;public Point a;public Point b;public Point c;public Point d;}public static void main(String[]w)throws Exception{BufferedImage i=ImageIO.read(new File(w[0]));List<R>r=new Vector<R>();for(int y=0;y<i.getHeight();y++){for(int x=0;x<i.getWidth();x++){Color c=new Color(i.getRGB(x,y));if(c.getRGB()==-1){continue;}R t=null;for(R s:r){if(s.k.equals(c)){t=s;}}if(t==null){t=new A().new R();r.add(t);}if(t.a==null){t.a=new Point(x, y);t.b=new Point(x, y);t.c=new Point(x, y);t.d=new Point(x, y);t.k=new Color(c.getRGB());}if(x<t.a.x){t.a.x=x;t.c.x=x;}if(x>t.b.x){t.b.x=x;t.d.x=x;}t.c.y=y;t.d.y=y;}}for(R s:r){List<Color>b=new Vector<Color>();for(int y=s.a.y;y<=s.c.y;y++){for(int x = s.a.x;x<=s.b.x;x++){if(i.getRGB(x, y)!=s.k.getRGB()){Color a=new Color(i.getRGB(x,y));boolean q=false;for(Color l:b){if(l.equals(a)){q=true;}}if(!q){b.add(a);} else {continue;}R f=null;for(R k:r){if(k.k.equals(a)){f=k;}}f.z=s.z+1;}}}}Collections.sort(r,new Comparator<R>(){public int compare(R a, R b){return a.z>b.z?1:(a.z==b.z?0:-1);}});for(int ii=r.size();ii>0;ii--){BufferedImage d=new BufferedImage(i.getWidth(),i.getHeight(),2);Graphics2D g=(Graphics2D)d.getGraphics();for(R s : r.subList(0, ii)){g.setColor(s.k);g.fillRect(s.a.x,s.a.y,s.b.x-s.a.x,s.c.y-s.a.y);}ImageIO.write(d,"png",new File(r.size()-ii+".png"));}}}

पूरा कोड जो थोड़ा सा है - और यह एक ख़ामोश है ;-) - अधिक स्पष्ट रूप से लिखा गया है, यहां पाया जा सकता है: http://pastebin.com/UjxUUXRp

इसके अलावा, अब जब मुझे डायटर की अधीनता दिखाई दे रही है, तो मैं कुछ हिस्सों को आसान बना सकता था। यह वास्तव में आयत को खोजने के लिए आवश्यक नहीं है जिसका रंग किसी अन्य आयत को ओवरलैप कर रहा है। मैं वास्तव में सिर्फ 'हमलावर' रंगों की संख्या की गिनती कर सकता था।

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