방해받지 않는 직사각형 제거


20

이 이미지는 서로 다른 색상의 사각형 7 개를 서로 겹쳐서 만들어졌습니다.

메인 이미지

검은 색과 적갈색 사각형은 막히지 않습니다. 즉, 그 위에 다른 사각형이 없습니다.

이와 같은 이미지를 취하는 프로그램을 작성하고 막히지 않은 직사각형 하나를 제거하여 결과 이미지를 출력하십시오.

위의 이미지에서 프로그램을 실행하고 출력에서 ​​다시 실행하면 다음과 같이 진행될 수 있습니다.

실행 1-검은 색 제거 (적갈색이 될 수 있음) :

실행 1

실행 2-적갈색 제거 (선택 사항 만) :

실행 2

실행 3-노란색 제거 (선택 사항 만) :

3을 실행

실행 4-파란색이 제거되었습니다 (녹색 일 수 있음).

뛰다 4

실행 5-녹색 제거 (선택 사항 만) :

달리다 5

실행 6-브라운 제거 (선택 사항 만) :

6을 실행

실행 7-빨간색 제거 (선택 사항 만) :

7을 실행

추가로 실행하면 동일한 흰색 이미지가 생성됩니다.

다행히 Stack Exchange는 이러한 이미지를 손실없이 압축하지 않았습니다.

이미지는 항상 흰색 배경을 가지며 각 사각형은 흰색이 아닌 고유 한 RGB 색상입니다.

이미지를 항상 일련의 겹치는 사각형으로 해석 할 수 있다고 가정 할 수 있습니다. 특히, 특정 색상의 경우 이미지 상단에 가장 가까운 해당 색상의 픽셀이 해당 색상 사각형의 상단 가장자리의 일부라고 가정 할 수 있습니다. 아래쪽, 왼쪽 및 오른쪽 가장자리에도 동일하게 적용됩니다.

예를 들어,이 이미지에서 주황색 사각형이 오래된 빨간색 위쪽 가장자리를 덮었으므로 빨간색 사각형의 위쪽 가장자리는 노란색 사각형의 아래쪽 가장자리 바로 아래에 있습니다.

예 1

이 이미지에서 빨간색 사각형을 먼저 제거 할 수 있습니다 (검정 / 적갈색 / 주황색 / 회색과 함께).

예 2

아래쪽 사각형의 순서가 모호한 경우 순서를 지정할 수 있습니다.

예를 들어, 여기 왼쪽 이미지는 중간 또는 오른쪽이 될 수 있습니다.

예 3 예 4 예 5

출력에는 역설적 인 겹침이 없어야합니다 (그래서 화가의 알고리즘으로 만들 수 있어야합니다). 따라서이 이미지에서 ( user23013 덕분에 ) 주황색 사각형 아래에서 녹색이어야합니다.

예 6

추가 세부 사항

  • 이미지와 사각형의 크기는 다를 수 있습니다.
  • 사각형이 이미지 테두리에 닿을 수 있습니다.
  • 최대 256 개의 3-1 개의 사각형 이있을 수 있습니다 .
  • 입력이 완전히 흰색이면 출력도 같아야합니다.
  • 이미지 라이브러리를 사용할 수 있습니다.
  • 입력은 이미지 파일 이름 또는 원시 이미지 데이터 여야합니다. stdin 또는 명령 행에서 올 수 있습니다.
  • 출력은 동일하거나 다른 이미지 파일에 쓰거나 stdout로 뿌려 지거나 간단히 표시 될 수 있습니다.
  • 일반적인 무손실 트루 컬러 이미지 파일 형식이 허용됩니다.

가장 적은 바이트를 가진 제출이 이깁니다.



기술적으로 요구 사항에는 출력이 역설적 겹침이 없을 수 있다고 말하는 것은 없습니다. 추가해야합니까, 아니면 테스트 사례에 대한 해석이 모두 정상입니까?
John Dvorak

"트루 컬러"를 명확하게 설명해 주시겠습니까?
FUZxxl


@ JanDvorak 나는 그것이 암시되기를 희망했지만, 당신은 맞습니다, 그것은 확실하지 않으므로, 그것에 대해 메모를 추가했습니다.
Calvin 's Hobbies

답변:


10

CJam, 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

ppm 파일 형식을 사용합니다. 사용법 예 (ImageMagick 사용) :

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

글쎄요, 너무 길고 너무 느립니다 ... 예제를 위해 약 1 분 정도 실행됩니다.

테스트를 쉽게하기 위해 테스트 사례의 크기를 조정하고 다른 사례를 추가했습니다.

색상 공간 정보가 손실되어 색상이 약간 다릅니다.


2

파이썬, 690 651 610 606 594 569 바이트

스크립트는 stdin에서 이미지 이름을 읽습니다.

모든 직사각형의 가장자리를 감지하고 포함 된 다른 색상 수로 정렬합니다 (방해되지 않은 직사각형에는 1 색상 만 포함되어 목록의 끝에 나타납니다)

이 목록은 이미지를 다시 그리는 데 사용됩니다. 다시 그리기 순서는 입력과 픽셀 차이가 가장 적은 출력 이미지를 생성하는 목록의 순열을 선택하여 결정됩니다.

PIL 가져 오기 이미지에서 l로, ImageDraw에서 D로; itertools에서 가져 오기 *; O, R, I, Z, k = [], range, l.open (raw_input ()), {}, lambda x : -x [1 ]; (W, H), Q = I. 크기, I.load ()
제품의 i, j (R (W), R (H)) :
 c = Q [i, j]
 Z : x, y, X, Y = Z [c]에서의 c 인 경우; Z [c] = [x, y, max (X, i), max (Y, j)]
 else : Z [c] = [i, j, 0,0]
순열에서 n의 경우 (c ((x, y, X)의 경우 제품 (R (x, X), R (y, Y))}의 경우 {(c, len ({Q [g])) Y) Z.items ()], key = k) [1 : -1]) : o = l.new (I.mode, I.size, 0xFFFFFF); [D.Draw (o) .rectangle (Z [c], fill = c) c의 경우 n, n의 경우]; O + = [(o, sum (abs (ab)의 경우 t, T의 경우 zip (I.getdata (), o.getdata ())의 경우 a, 우편 번호 b (t, T)))]
최대 (O, 키 = k) [0] .show ()

0

자바-1483 바이트

나는 훌륭한 코드 골퍼가 아닙니다. 그래서 장황함이 전적으로 Java의 잘못은 아닙니다. ;-) 그럼에도 불구하고, 이것은 정말 재미있는 도전으로 보입니다. 나는 약간 지루하고 장황한 방식으로 해결했지만, 야. 작동합니다. (상대적으로) 빠르며 특히 재미있었습니다!

아이디어는 다음과 같습니다. 왼쪽 상단에서 시작하여 오른쪽 하단에서 각 픽셀을 확인합니다. 흰색 픽셀입니까? 무시 색깔이 있습니까? 시원합니다. 추적하고 경계를 결정하십시오 (왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래).

완료되면 각 사각형의 영역을 확인하십시오. 사각형의 색과 다른 색이 포함되어 있습니까? 그런 다음 해당 사각형에 속한 사각형을 찾아 겹치는 사각형의 z- 색인을 1 씩 업데이트하십시오.

마지막으로 z 표시를 고려하면서 모든 직사각형을 그립니다. 실제로 CSS 및 기타 3D 관련 자료에서 z- 색인처럼 작동합니다. z- 색인이 가장 낮은 사각형이 먼저 그려지고 가장 높은 z- 색인이 마지막에 그려집니다.

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

또한, 저는 다이어트 담당자의 제출을 ​​보았으므로 일부 부분을 더 쉽게 만들 수있었습니다. 색상이 다른 직사각형과 겹치는 직사각형을 찾을 필요는 없습니다. 실제로 '침입'색상의 수를 셀 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.