Xóa một hình chữ nhật không bị cản trở


20

Hình ảnh này được thực hiện bằng cách chồng 7 hình chữ nhật có màu khác nhau lên nhau:

hình ảnh chính

Các hình chữ nhật màu đen và maroon không bị cản trở , nghĩa là không có hình chữ nhật nào khác ở trên chúng.

Viết chương trình lấy một hình ảnh như thế này và loại bỏ bất kỳ hình chữ nhật không bị cản trở nào, xuất ra hình ảnh kết quả.

Thí dụ

Nếu bạn chạy chương trình của bạn trên hình ảnh ở trên và tiếp tục chạy lại nó ở đầu ra, nó có thể tiến triển như thế này.

Chạy 1 - Đen bị xóa (có thể đã được kết hôn):

chạy 1

Chạy 2 - Maroon bị xóa (chỉ có sự lựa chọn):

chạy 2

Chạy 3 - Xóa màu vàng (chỉ lựa chọn):

chạy 3

Chạy 4 - Màu xanh đã bị xóa (có thể là màu xanh lá cây):

chạy 4

Chạy 5 - Xóa màu xanh lá cây (chỉ có sự lựa chọn):

chạy 5

Chạy 6 - Loại bỏ màu nâu (chỉ có sự lựa chọn):

chạy 6

Chạy 7 - Xóa màu đỏ (chỉ lựa chọn):

chạy 7

Bất kỳ lần chạy bổ sung nào cũng sẽ tạo ra hình ảnh trắng giống nhau.

Hy vọng rằng Stack Exchange đã không nén bất kỳ hình ảnh nào trong số này.

Hình ảnh sẽ luôn có nền trắng và mỗi hình chữ nhật sẽ là một màu RGB duy nhất không phải là màu trắng.

Bạn có thể giả định rằng hình ảnh luôn có thể được hiểu là một tập hợp các hình chữ nhật chồng chéo. Cụ thể, bạn có thể giả sử rằng, đối với một màu cụ thể, pixel có màu đó gần với đỉnh của hình ảnh là một phần của cạnh trên của hình chữ nhật của màu đó. Điều tương tự giữ cho các cạnh dưới, trái và phải.

Vì vậy, ví dụ, trong hình ảnh này, cạnh trên của hình chữ nhật màu đỏ sẽ nằm ngay dưới cạnh dưới của hình chữ nhật màu vàng, vì hình chữ nhật màu cam bao phủ cạnh trên màu đỏ cũ:

ví dụ 1

Trong hình ảnh này, hình chữ nhật màu đỏ có thể được loại bỏ trước tiên (cùng với màu đen / maroon / cam / xám):

ví dụ 2

Khi thứ tự của các hình chữ nhật thấp hơn là mơ hồ, bạn có thể cung cấp cho chúng bất kỳ thứ tự nào.

Ví dụ: hình ảnh bên trái ở đây có thể trở thành giữa hoặc bên phải:

ví dụ 3 ví dụ 4 ví dụ 5

Đầu ra không được có sự chồng chéo nghịch lý (do đó, làm cho nó bằng thuật toán của họa sĩ là có thể). Vì vậy, trong hình ảnh này ( cảm ơn người dùng23013 ), nó sẽ phải có màu xanh dưới hình chữ nhật màu cam:

ví dụ 6

Chi tiết bổ sung

  • Hình ảnh và hình chữ nhật có thể có bất kỳ kích thước.
  • Các hình chữ nhật có thể chạm vào đường viền hình ảnh.
  • Có thể có tới 256 hình chữ nhật 3 - 1.
  • Nếu đầu vào là hoàn toàn trắng, đầu ra cũng nên.
  • Bạn có thể sử dụng thư viện hình ảnh.
  • Đầu vào phải là tên tệp hình ảnh hoặc dữ liệu hình ảnh thô. Nó có thể đến từ stdin hoặc dòng lệnh.
  • Đầu ra có thể được ghi vào cùng một hoặc một tệp hình ảnh khác, được phun thô thành thiết bị xuất chuẩn hoặc hiển thị đơn giản.
  • Bất kỳ định dạng tệp hình ảnh truecolor lossless phổ biến đều được cho phép.

Việc gửi với ít byte nhất sẽ thắng.



Về mặt kỹ thuật, không có gì trong các yêu cầu nói rằng đầu ra có thể không có sự chồng chéo nghịch lý. Nó nên được thêm vào, hoặc cả hai cách giải thích của trường hợp thử nghiệm đều ổn?
John Dvorak

Bạn có thể vui lòng làm rõ về tru trecolor màu?
FUZxxl


@JanDvorak Tôi đã hy vọng điều đó được ngụ ý nhưng, bạn nói đúng, không rõ ràng, vì vậy tôi đã thêm một lưu ý về nó.
Sở thích của Calvin

Câu trả lời:


10

CJam, 241 byte

(với dòng mới bị xóa.)

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

Nó sử dụng định dạng tệp ppm. Ví dụ sử dụng (sử dụng ImageMagick):

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

Chà, nó quá dài và quá chậm ... Chạy khoảng một phút cho ví dụ.

Tôi thay đổi kích thước các trường hợp thử nghiệm (và thêm một số trường hợp khác) để làm cho thử nghiệm dễ dàng hơn.

Có vẻ như thông tin không gian màu bị mất nên màu sắc hơi khác nhau.


2

Python, 690 651 610 606 594 569 byte

Kịch bản đọc tên hình ảnh từ stdin.

Nó phát hiện các cạnh của mỗi hình chữ nhật, sắp xếp chúng theo số lượng màu khác nhau mà chúng chứa (hình chữ nhật không bị cản trở chỉ chứa 1 màu, sau đó xuất hiện ở cuối danh sách)

Danh sách này được sử dụng để vẽ lại một hình ảnh. Thứ tự vẽ lại được quyết định bằng cách chọn hoán vị của danh sách sẽ tạo ra một hình ảnh đầu ra có độ chênh lệch pixel ít nhất với đầu vào.

từ nhập PIL Ảnh dưới dạng l, ImageDraw dưới dạng D; từ nhập itertools *; O, R, I, Z, k = [], phạm vi, l.open (raw_input ()), {}, lambda x: -x [1 ]; (W, H), Q = I.size, I.load ()
cho i, j trong sản phẩm (R (W), R (H)):
 c = Q [i, j]
 nếu c trong Z: x, y, X, Y = Z [c]; Z [c] = [x, y, max (X, i), max (Y, j)]
 khác: Z [c] = [i, j, 0,0]
cho n theo hoán vị (được sắp xếp ([(c, len ({Q [g] cho g trong sản phẩm (R (x, X), R (y, Y))})) cho c, (x, y, X, Y) trong Z.items ()], key = k) [1: -1]): o = l.new (I.mode, I.size, 0xFFFFFF); [D.Draw (o) .r chữ nhật (Z) [c], điền = c) cho c, _ in n]; O + = [(o, sum (abs (ab) cho t, T trong zip (I.getdata (), o.getdata ()) cho a, b trong zip (t, T)))]
tối đa (O, khóa = k) [0] .show ()

0

Java - 1483 byte

Tôi không phải là một tay golf mã tuyệt vời, hãy nói rõ điều đó; do đó, mức độ chi tiết không hoàn toàn là lỗi của Java ;-) Tuy nhiên, đây dường như là một thử thách thực sự thú vị. Tôi đã giải quyết nó theo cách mà - tôi nghĩ - hơi nhàm chán và dài dòng, nhưng này. Nó hoạt động, nó (tương đối) nhanh và đặc biệt, nó rất vui!

Ý tưởng như sau: Kiểm tra từng pixel bắt đầu từ góc trên cùng bên trái cho đến dưới cùng bên phải. Có phải là một pixel trắng? Bỏ qua. Nó có màu không? Thật tuyệt, hãy theo dõi nó và cố gắng xác định ranh giới của nó (trên cùng bên trái, trên cùng bên phải, dưới cùng bên trái, dưới cùng bên phải).

Khi đã xong, kiểm tra từng khu vực hình chữ nhật. Nó có chứa một màu khác với màu của hình chữ nhật không? Sau đó tìm ra hình chữ nhật nào thuộc màu đó và cập nhật chỉ số z của hình chữ nhật đó lên 1.

Và cuối cùng, vẽ tất cả các hình chữ nhật trong khi tính đến các chỉ số z. Nó hoạt động thực sự giống như một chỉ mục z mà bạn biết từ CSS và các công cụ 3D khác. Các hình chữ nhật có chỉ số z thấp nhất được vẽ trước, chỉ số z cao nhất cuối cùng.

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"));}}}

Mã hoàn chỉnh là một chút - và đó là một cách nói nhỏ ;-) - được viết rõ ràng hơn, có thể được tìm thấy ở đây: http://pastebin.com/UjxUUXRp

Ngoài ra, bây giờ tôi thấy sự phục tùng của người ăn kiêng, tôi có thể làm cho một số phần dễ dàng hơn. Không thực sự cần thiết để tìm hình chữ nhật có màu chồng lên hình chữ nhật khác. Tôi thực sự có thể chỉ cần đếm số lượng màu 'xâm chiếm'.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.