長方形が長方形のスペースを隙間や重なりなしに埋めているかどうかを確認します


8

この課題は、別の同様の課題に基づいています。長方形の最も効率的なパッキングを見つけることはNP困難であるため(つまり、その解決策は簡単に確認できるが見つけにくい)、この課題はここでの課題よりもはるかに簡単です。

この挑戦

長方形の束が与えられた場合、それらが長方形のスペースをギャップやオーバーラップなしで埋めるかどうかを把握します。

入力

入力には2つの形式があり、1つはスコアリングペナルティを伴います。

1つ目は、長さが4のサブリストのリストです。このリストには、反対の頂点の座標である4つの整数が含まれています。すべての長方形は水平/垂直になるため、長方形がどこにあるかについてのあいまいさはありません。各サブリストには、最初の頂点のx座標、最初の頂点のy座標、2番目の頂点のx座標、2番目の頂点のy座標の順に、4つの整数が含まれます。

2番目:同じ長さの整数の4つのリストが含まれます。4つのリストは異なる座標を表します。入力オプション1を行列と考えると、ここでの入力は行列の転置にすぎません。この入力には、+20%バイトのペナルティがあります。

出力

単純な真実/偽の出力。

仕様書

エリア0(つまりx1 == x2 || y1 == y2)の長方形がある場合は、この長方形を無視してください(そのため[0 0 1 1], [2 2 3 2]有効です)。この仕様は、人々が最小/最大x / y値を簡単に取得することを困難にするために用意されています。

x1 <= x2y1 <= y2常に正しいとは限りません。の場合x1 > x2 || y1 > y2、長方形は面積ゼロの長方形ではありません。むしろ、それは間の長方形の空間を占有(x1, y1)して(x2, y2)
座標は負の値でもかまいませんが、その場合でも座標間のスペースを占めます。
左上の長方形は常にとは限りません(0, 0)。したがって、塗りつぶされる長方形のスペースの左上隅がであるとは限りません(0, 0)
(これらのあいまいさを指摘してくれた@xnorに感謝)

入力方法と出力の表現方法を指定してください。

得点

スコアは、バイト単位のコードのサイズに、該当する場合はバイトのペナルティを加えたものです。12月15日の時点での最低スコアが勝利します。

テストケース

0 0 1 2
1 0 3 1 ==> true
1 1 3 2

0 0 2 2
0 0 1 1 ==> false
0 0 0 0

0 0 1 1
2 2 2 2 ==> true
0 1 2 1

頑張って、楽しいゴルフを!


長方形の角は(0,0)でなければなりませんか?座標は負にできますか?
xnor

私たちは、それぞれの長方形が持っていることが保証されているx1 <= x2y1 <= y2?エリア0の長方形であるx1 == x2y1 <= y2可能性は?
xnor 2016年

@xnorこれらはすべて私が考慮に入れなかった小さなことです。それらを指摘してくれてありがとう、私は編集で明確にします。これらの質問に対する私の答えは、いいえ、はい、いいえ、はいです。
HyperNeutrino 2016年

このような詳細を打ち出すには、サンドボックスをお勧めします。テストケースは、これらのコーナーケースのできるだけ多くをカバーする必要があります。「したがって、リストは[x1、y1、x2、y2]のようになります。ここで、(x1、y1)と(x2、y2)は、左上と右下の頂点を表します。」場合x1 > x2y1 > y2座標が切り替えられているため、これは面積ゼロの長方形のですか?
XNOR

2
誰かが数愛好家を見ましたか?
orlp

回答:


0

JavaScript(ES6)、249バイト

with(Math)a=>!(a=a.map(([l,t,r,b])=>[l<r?l:r,t<b?t:b,l>r?l:r,t>b?t:b]).filter(g=([l,t,r,b])=>(r-l)*(b-t))).reduce((s,b)=>s-g(b),g([min,min,max,max].map((f,i)=>f(...a.map(a=>a[i])))))>a.some(([l,t,r,b],i)=>a.some(([m,u,s,c],j)=>i!=j&l<s&m<r&t<c&u<b))

注:これを使用するには、それを文字列として評価して結果を変数に割り当てるか、の後に割り当てを挿入しwith(Math)ます。説明:

with(Math)a=>!(持参minし、maxスコープに。
a=a.map(([l,t,r,b])=>[l<r?l:r,t<b?t:b,l>r?l:r,t>b?t:b])座標を正規化
.filter(g=([l,t,r,b])=>(r-l)*(b-t)))する空の長方形を削除し、面積を計算する関数も定義する境界ボックスの面積から
.reduce((s,b)=>s-g(b),すべての長方形の面積を差し引き、長方形が重なっていないことを確認し
g([min,min,max,max].map((f,i)=>f(...a.map(a=>a[i])))))ます
>a.some(([l,t,r,b],i)=>a.some(([m,u,s,c],j)=>i!=j&l<s&m<r&t<c&u<b))


これのテストに問題があります。「割り当てを挿入する」とはどういう意味ですか?(ES6の経験は一切ありません)。または、可能であれば、いくつかのテストケースへのリンクを提供できますか?ありがとう。
HyperNeutrino 2016年

@AlexL。例えば、あなたはeg with(Math)f=a=>などを書く必要があることを意味します- f=最初にを置くことは動作しません。
Neil、

はい。私はあなたが何を意味しているのかはわかりますが、私が試したすべてのオンラインコンパイラはさまざまなエラーを引き起こしました。実際に機能するコンパイラを提供していただけませんか(他のコンパイラはおかしいです)。
HyperNeutrino 2016年

@AlexL。ああ、私は自分の編集の1つを入力したと思います。私は再確認しましたが、今は大丈夫です。
Neil

これを受け入れ済みとしてマークします。私はテスト結果であなたを信頼します、そして私はそれを検証しようと試み続けます。
HyperNeutrino 2016

0

Mathematica、194バイト

(r=Select[#,(#-#3)(#2-#4)&@@#>0&];m={#~Min~#3,#2~Min~#4,#~Max~#3,#2~Max~#4}&@@Transpose@r;b=Boole[(x-#)(x-#3)<0&&(y-#2)(y-#4)<0]&;Integrate[(Plus@@(b@@@r)-b@@m)^2,{x,#,#3}&@@m,{y,#2,#4}&@@m]<1)&

ゴルフされていないバージョン:

1  (r = Select[#1, (#1 - #3) (#2 - #4) & @@ #1 > 0 &]; 
2   m = {Min[#1, #3], Min[#2, #4], Max[#1, #3], Max[#2, #4]} & @@ Transpose[r]; 
3   b = Boole[(x - #1) (x - #3) < 0 && (y - #2) (y - #4) < 0] &;
4   Integrate[
5     (Plus @@ (b @@@ r) - b @@ m)^2 ,
6     {x, #1, #3} & @@ m ,
7     {y, #2, #4} & @@ m
8   ] < 1
9  ) &

行1はr、指定された入力からの重要な長方形のセットになるように定義します。(& @@このコードでは多くのことが行われています。これ#1,#2,#3,#4は、の代わりにリストの4つの要素に使用できるようにするためです#[[1]],#[[2]],#[[3]],#[[4]]。)次に、2行目はm、にリストされているすべての長方形を囲む最小の長方形の座標になるように定義しますr。したがって、入力長方形が大きな長方形を並べる場合、その大きな長方形はでなければなりませんm

ライン3つの定義関数b矩形を表す四重極に印加される、2つの変数の関数を生成xし、y点があれば、それは1に等しく、(x,y)そうでない場合は矩形と0内にあります。5行目は、これらの関数の多くを生成します。1つはr(すべてが加算されて)長方形ごとに1つ、最後の1つは大きな長方形m(減算されたもの)用に生成されます。次に、その複雑な2変数関数を二乗します。

この時点で重要なのは、小さな四角形が大きな四角形を並べる場合、2変数関数はまったく0ですが、2つの小さな四角形が重なる場合はいくつかの正の値になり、一部の場合はいくつかの負の値(平方する前)になります。大きな長方形のカバーされていません。これを検出するには、大きな長方形上で2変数関数を文字通り積分(!)します(積分の制限は6〜7行目に示されています)。0を取得した場合、タイリングは完全であり、正の値を取得した場合、それからどこかに問題がありました。見えているものはすべて整数なので、8行目< 1== 0はなくを使用して、最後の1バイトを保存します。

(Mathematicaの計算を使ってこの組み合わせの問題を解決する能力を活用できるのはとても楽しいと思います。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.