バックグラウンド
フェンスを作りたいです。そのために、私はたくさんの棒を集めて、それらを地面に貼りました。実際のフェンスを作るためにポールに釘付けにするボードもたくさん集めました。私はものを構築するときに夢中になる傾向があり、おそらくそれを置く場所がなくなるまでボードをポールに釘付けし続けるでしょう。最終的に可能なフェンスを列挙してほしい。
入力
入力は、便利な形式で極の位置を表す2次元整数座標のリストです。重複は含まれていないと想定できますが、その順序については何も想定できません。
ボードは、極の間の直線で表されます。簡単にするために、水平ボードと垂直ボードのみを考慮します。間に2つの極またはボードが存在しない場合、2つの極をボードで結合できます。つまり、ボードを相互に交差させることはできません。ポールとボードの配置は、新しいボードを追加できない場合に最大になります(同等に、水平または垂直に配置された2つのポールの間にポールまたはボードが存在します)。
出力
出力は、極を使用して構築できる最大配置の数です。
例
入力リストを検討する
[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)]
上から見ると、対応する極の配置は次のようになります。
o
o o
o o
o o
o
これらの極を使用して構築できる3つの最大配置があります。
o o o
o-o o|o o-o
o----o o||| o o| | o
o-o o|o o-o
o o o
したがって、正しい出力は3
です。
ルール
関数または完全なプログラムのいずれかを記述できます。最も低いバイト数が優先され、標準の抜け穴は許可されません。
テストケース
[] -> 1
[(0,0),(1,1),(2,2)] -> 1
[(0,0),(1,0),(2,0)] -> 1
[(0,0),(0,1),(1,0),(1,1)] -> 1
[(1,0),(0,1),(-1,0),(0,-1)] -> 2
[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)] -> 3
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1)] -> 3
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1),(0,-1)] -> 4
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(0,-1),(2,2)] -> 5
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1),(0,-1),(2,2)] -> 8
(0,-2)
良いキャッチです。今変わります。