長方形の交点を数える


8

チャレンジ

任意の量の長方形を指定して、2D平面に描画されたときの長方形の交差の合計数を出力します。

ここでの交点Pは、互いに直交し、どちらもで終わっていない2本の線が交差する点として定義されPます。

ここでの各長方形は、最初に左上隅の座標、次に右下隅の座標を持つ2タプルで表されます。

[(-8,6)、(-4、-2)]
[(-4,9)、(4,3)]
[(2,10)、(14,4)]
[(1,7)、(10、-6)]
[(7,4)、(10,2)]
[(5,2)、(9、-4)]
[(-6、-4)、(-2、-6)]

ここに画像の説明を入力してください

これらの長方形は、6つの交差点を作成します。これが出力でなければなりません。

  • 上の画像からわかるように、長方形にタッチしても、ここでは交差が作成されず、カウントされません。
  • 再タグ付けは、任意の形式でエンコードできます。使用する形式を明確にしてください。
  • 複数の長方形が同じ点で交差する場合、それは1つの交差としてのみカウントされます。
  • 座標は常に整数です。
  • 入力に重複する長方形はありません。
  • 入力として常に少なくとも1つの長方形を取得します。
  • この問題を直接解決するビルトインは使用できません。さらに、方程式を解くビルトインは使用できません。他のすべての組み込みは許可されます。
  • 出力は、交差数を示す単一の整数でなければなりません。

ルール

  • 機能または完全なプログラムが許可されています。
  • 入力/出力のデフォルトのルール
  • 標準の抜け穴が適用されます。
  • これはなので、最小のバイト数が優先されます。タイブレーカーは以前の提出です。

テストケース

上記の例と同じフォーマット。長方形はリストにラップされます。

[[(-8,6)、(-4、-2)]、[(-4,9)、(4,3)]、[(2,10)、(14,4)]、[(1 、7)、(10、-6)]、[(7,4)、(10,2)]、[(5,2)、(9、-4)]、[(-6、-4)、 (-2、-6)]]-> 6
[[(-2,2)、(6、-4)]]-> 0
[[(-12,10)、(-8,6)]、[(-14,6)、(-10,2)]、[(-10,6)、(-6,2)]]- > 0
[[(-4,10)、(6,2)]、[(-2,8)、(4,3)]、[(1,6)、(8,4)]、[(2,11 )、(5,5)]]-> 10
[[(8,2)、(12、-2)]、[(10,0)、(14、-4)]]-> 2
[[(0,2)、(2,0)]、[(0,1)、(3,0)]]-> 1
[[(-10、-2)、(-6、-6)]、[(-6、-2)、(-2、-6)]、[(-8、-4)、(-4、 -8)]]-> 3

ハッピーコーディング!


図によると、2つ以上の長方形の交点にある多くの点は明らかに無視されているため、回答をカウントする対象を定義する必要があります。
feersum

1
では、[[(0,0),(1,2)],[(0,0),(2,1)]]交差点は1つですか?
Neil

@ニールその通り。このテストケースを追加します。ありがとう!
Denker 2016年

@feersumダイアグラムでは、何を数え、何を数えないかがかなり明確になると思います。しかし、正式な定義は私が害を及ぼすとは思わないので、追加します。
Denker 2016年

1
(x、y)で交差する長方形のペアがN個ある場合、ポイント(x、y)は1回またはN回カウントされますか?
feersum

回答:


2

JavaScript(ES6)、186バイト

a=>a.map(([a,b,c,d])=>h.push([b,a,c],[d,a,c])&v.push([a,b,d],[c,b,d]),h=[],v=[])|h.map(([d,a,e])=>v.map(([c,f,b])=>a<c&c<e&b<d&d<f&t.every(([a,b])=>a-c|b-d)&&t.push([c,d])),t=[])|t.length

各長方形をコンポーネントラインに分割し、水平線と垂直線を交差させ、重複を避けるために交差のリストを作成します。


どの入力形式を使用していますか?タストケースでこれを呼び出すと、常にゼロになります。
Denker 2016年

@DenkerAffe申し訳ありませんが、4要素の配列の配列を期待しています[[-4,10,6,2],[-2,8,4,3],[1,6,8,4],[2,11,5,5]]。JavaScriptにはタプルがないため、例を文字通り使用しようとした場合は、代わりにコンマ演算子をトリガーして、入力を無効にします。
Neil

わかりました、ありがとう。ただし、複数の長方形の交点は1つの交点としてしかカウントされないため、最後のテストケースでは3ではなく4になります。私があなたの答えを投稿した後でこれを明確にしたので、これは私に続きます。ご不便をおかけして申し訳ありませんが、これを修正するのはそれほど難しくありません。
Denker、2016年

@DenkerAffe私はあなたの新しい仕様で動作するように更新しました。
Neil

0

Mathematica 138バイト

終了していません!これは、以下を除くすべてのケースで機能します[[(0,0),(1,2)],[(0,0),(2,1)]]


Length@Union[Join@@(Cases[RegionIntersection@@# &/@Subsets[Line[{{#,#2},{#3,#2},{#3,#4},{#,#4},{#,#2}}]&@@@Flatten/@#,{2}],Point@a__:> a])]

Length@Union[
Join @@ (Cases[RegionIntersection @@ # & /@ Subsets[
Line[{{#, #2}, {#3, #2}, {#3, #4}, {#, #4}, {#, #2}}] & @@@ Flatten /@ #, {2}], 
Point@a__ :> a])] &@{{{-8, 6}, {-4, -2}}, {{-4, 9}, {4, 3}}, {{2, 10}, {14, 4}}, 
{{1, 7}, {10, -6}}, {{7, 4}, {10, 2}}, {{5, 2}, {9, -4}}, {{-6, -4}, {-2, -6}}}

6

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