シュートアピアリング


16

梨とスチール シュートの 5つの画像を次に示します。

A:B:C:D:E:梨A 梨B 梨C 梨D 梨E

これらはサムネイルのみです。クリックするとフルサイズになります。

Algodooで作成しました。)

このクラスの画像には、常に次のプロパティがあります。

  1. 背景は常に400×400ピクセルです。(SEイメージは非可逆圧縮されるため、完全に白ではない場合があります。)
  2. それらは1〜4個の同一の梨を持ち、それぞれが(ほぼ)任意の方法で回転して配置されます。
  3. 彼らは、画像の下部に到達する1つの垂直スチールシュートを持っています。
  4. シュートの下部を除いて、シュートと梨の境界ボックス(境界ボックスの例)は決して画像境界に触れたり、境界から出たりすることはありません。
  5. 梨のバウンディングボックスが互いに重なることも、シュートと重なることもありません。
  6. BC、およびDのように、梨はシュートの傾斜部分の下にある場合があります。(したがって、シュートのバウンディングボックスはナシのバウンディングボックスと重なる場合があります。)
  7. シュートは、ナシのすべてのバウンディングボックスがその上に自由に収まるだけの十分なスペースがあり(「ベアフィット」ケースはテストされない)、コラム部分の一部が見える限り、任意の水平および垂直位置にできます。

チャレンジ

そのような画像を取り込み、同じ場所にシュートがある別の400×400画像を出力するプログラムを作成しますが、梨はすべてシュートの上にくるように再配置されます(そうすれば、それらはシュートに落ちてジュースになります)。

出力イメージの要件は次のとおりです。

  1. 入力画像内のすべての梨は、シュートの上、漏斗の左端と右端の間にあるように再配置する必要があります。(エッジを超えることはできません。)
  2. 各ナシは、回転角度を維持する必要があります。(したがって、梨を切り直して貼り付けるのではなく、梨を切り取って貼り付ける必要があります。)
  3. 梨は互いに重なり合ったり、互いに触れたり、シュートに触れたりしてはなりません。(ただし、梨の境界ボックスは重なる場合があります。)
  4. 梨が触れたり、画像の境界から出たりしてはいけません。

5つのサンプル画像の有効な出力の例を次に示します。

A:B:C:D:E:アウトA アウトB アウトC アウトD アウトD

これらはサムネイルのみです。クリックするとフルサイズになります。

Eの入力画像はすでに有効な出力でしたが、技術的に必要ないときに梨を再配置するだけで十分であることに注意してください。

詳細

  • stdin /コマンドライン/関数呼び出しを使用して、画像のファイル名または生の画像データを取得します。
  • 選択した名前のファイルに画像を出力するか、生の画像ファイルデータを標準出力に出力するか、単に画像を表示します。
  • 一般的なロスレス画像ファイル形式を使用できます。
  • グラフィックおよび画像ライブラリを使用できます。
  • あちこちにあるいくつかの不正確なピクセル(損失など)が大したことではありません。視覚的に間違っていることがわからない場合は、おそらく大丈夫です。

バイト単位の最短コードが優先されます。Tiebreakerは、最も投票数の多い投稿です。


カーンアカデミーアカウントを持っているので、これで問題を解決するのに最適なようですが、カーンアカデミーで解決できますか?複雑さは1つだけです。外部イメージは許可されません。幸いなことに、これを介して画像を実行し、カーンアカデミーフレンドリーなデータに変換できます。これは受け入れられますか?
BobTheAwesome

@BobTheAwesomeそれでは、JavaScriptの回答を投稿したいですか?それは問題ありませんが、400x400の画像を入出力することになっています。KAでどのようにそれをしたかを示すために作品を投稿することができますが、400x400の画像で機能しない場合は勝者として受け入れないかもしれません。
カルビンの趣味

完全な偶然。カーンアカデミーには、Javascript + Pjsのデフォルトの400x400pxキャンバスがあります。
BobTheAwesome

番号!!Imagenatorは400x400の画像で超低速です!!
BobTheAwesome

回答:


6

Python 2.7、636バイト

import sys;from PIL.Image import*
_,m,R,I,p,H=255,400,range,open(sys.argv[1]).convert('RGB'),[],0
w,h=I.size;W,A,P,L=(_,_,_),[(x,y)for x in R(w)for y in R(h)],I.load(),I.copy()
try:
 while 1:
    s,x,y,X,Y=[[a for a in A if P[a][0]<50][0]],m,m,0,0
    while s:c=(a,b)=s.pop();x,y,X,Y=min(x,a),min(y,b),max(X,a),max(Y,b);P[c]=W;s+=[n for n in[(a+1,b),(a,b+1),(a-1,b),(a,b-1)]if n in A and P[n]!=W]
    p+=[((x,y,X,Y),X-x,Y-y)]
except:0
def G(a):r,g,b=P[a];return r==g==b and r<_
g=[a for a in A if G(a)]
(z,t),W=g[0],max([x for x,y in g]);t-=1
for r,w,h in p:
 if z+w>W:z,_=g[0];t-=H;H=0
 I.paste(L.crop(r),(z,t-h,z+w,t));z+=w;H=max(h,H)
I.show()

編集:画像を処理する前にアルファチャネルを削除し、必要に応じて梨を複数の行に揃えます

生成された画像:

A B C DおよびE

垂直ナシ(コンピューターで約3分かかります):

テストケース 垂直


1
画像は前/後ですか?もしそうなら、あなたはBEのために間違ったものを取っていると思う
...-Sp3000

右に左に入力画像と出力画像...彼らは再スケーリングおよびコピー・貼り付けのために、すべての画素完璧じゃない、私はどのようにスクリプトの動作上のヒントを与えるためにそれらを入れている...
ディーター

すべての梨が水平であればこれは機能しますか?
カルビンの趣味

実際にはいいえ... 2つの理由で:この特定の画像にはアルファチャネルがあるため、無限ループに陥ります->最初に画像を変換するようにスクリプトを修正します。梨をいくつかの行に揃えるコードを削除した他の理由->それを元に戻す
-Dieter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.