遮られていない長方形を削除する


20

この画像は、7つの異なる色の長方形を重ねて作成したものです。

メイン画像

黒と栗色の長方形は遮られていません。つまり、他の長方形はそれらの上にありません。

このような画像を取り込むプログラムを作成し、遮られていない長方形を1つ削除して、結果の画像を出力します。

上記のイメージでプログラムを実行し、出力でプログラムを再実行し続けると、次のように進行する可能性があります。

実行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またはコマンドラインから取得できます。
  • 出力は、同じ画像ファイルまたは別の画像ファイルに書き込むか、生のまま標準出力に出力するか、単に表示することができます。
  • 一般的なロスレストゥルーカラー画像ファイル形式はすべて許可されます。

最少バイトの送信が勝ちです。



技術的には、出力に逆説的な重複がないかもしれないと言う要件には何もありません。追加する必要がありますか、それともテストケースの両方の解釈に問題はありませんか?
ジョンドヴォルザーク

「トゥルーカラー」を明確にしてください。
FUZxxl


@JanDvorakそれが暗示されていることを望みましたが、あなたは正しい、それは不明瞭なので、私はそれについてのメモを追加しました。
カルバンの趣味

回答:


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

Python、690 651 610 606 594 569バイト

スクリプトは、stdinからイメージ名を読み取ります。

すべての四角形のエッジを検出し、含まれるさまざまな色の数で並べ替えます(遮るもののない四角形には1色しか含まれていないため、リストの最後に表示されます)

このリストは、画像を再描画するために使用されます。再描画順序は、入力とのピクセルの差が最小の出力画像を生成するリストの順列を選択することにより決定されます。

PILからイメージをlとして、ImageDrawをDとして、itertoolsから* import *; O、R、I、Z、k = []、range、l.open(raw_input())、{}、lambda x:-x [1 ];(W、H)、Q = I.size、I.load()
製品のi、j(R(W)、R(H))の場合:
 c = Q [i、j]
 Zのc:x、y、X、Y = Z [c]; Z [c] = [x、y、max(X、i)、max(Y、j)]の場合
 else:Z [c] = [i、j、0,0]
nの順列(sorted([(c、len({Q [g] for g in product(R(x、X)、R(y、Y))}))for c、(x、y、X、 Y)in Z.items()]、key = k)[1:-1]):o = l.new(I.mode、I.size、0xFFFFFF); [D.Draw(o).rectangle(Z [c]、fill = c)for c、_ in n]; O + = [(o、sum(abs(ab)for t、T in zip(I.getdata()、o.getdata())for a、 b in zip(t、T)))]]
max(O、key = k)[0] .show()

0

Java-1483バイト

私は優れたコードゴルファーではありません。はっきりさせてください。したがって、冗長性は完全にJavaのせいではありません;-)それにもかかわらず、これは本当に楽しい挑戦のように思えました。私はそれを少し退屈で冗長な方法で解決しましたが、ちょっとです。動作し、(比較的)高速で、特に楽しかったです!

アイデアは次のとおりです。各ピクセルを左上隅から右下まで確認します。白いピクセルですか?無視します。着色されていますか?クール、それを追跡し、その境界(左上、右上、左下、右下)を決定してみましょう。

それが完了したら、各長方形の領域を確認します。四角形の色とは異なる色が含まれていますか?次に、どの長方形がその色に属しているかを調べ、その重なり合う長方形のz-indexを1更新します。

そして最後に、Z指数を考慮しながらすべての長方形を描きます。実際には、CSSやその他の3Dのものから知っているz-indexのように機能します。最小のz-indexを持つ長方形が最初に描画され、最高のz-indexが最後に描画されます。

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.