釘のセットを木製の板に打ち込み、輪ゴムを巻き付けると、凸包が得られます。
あなたの使命は、あなたがそれを受け入れることに決めたなら、2Dポイントの与えられたセットの凸包を見つけることです。
いくつかのルール:
- 関数として記述し、ポイントのリスト座標(任意の形式)が引数です
- 出力は、任意の位置から開始して、時計回りまたは反時計回りにリストされた凸包内のポイントのリストである必要があります
- 出力リストは、各ポイントの座標が明確に区別できる合理的な形式にすることができます。(たとえば、1次元のリストではありません{0.1、1.3、4、...})
- 凸包のセグメント内の3つ以上のポイントが整列している場合、出力では2つの極値のみを保持する必要があります。
サンプルデータ:
サンプル0
入力:
{{1, 1}, {2, 2}, {3, 3}, {1, 3}}
出力:
{{3, 3}, {1, 3}, {1, 1}}
(図は単なる例示です)
サンプル1
入力:
{{4.4, 14}, {6.7, 15.25}, {6.9, 12.8}, {2.1, 11.1}, {9.5, 14.9},
{13.2, 11.9}, {10.3, 12.3}, {6.8, 9.5}, {3.3, 7.7}, {0.6, 5.1}, {5.3, 2.4},
{8.45, 4.7}, {11.5, 9.6}, {13.8, 7.3}, {12.9, 3.1}, {11, 1.1}}
出力:
{{13.8, 7.3}, {13.2, 11.9}, {9.5, 14.9}, {6.7, 15.25}, {4.4, 14},
{2.1, 11.1}, {0.6, 5.1}, {5.3, 2.4}, {11, 1.1}, {12.9, 3.1}}
サンプル2
入力:
{{1, 0}, {1, 1}, {1, -1}, {0.68957, 0.283647}, {0.909487, 0.644276},
{0.0361877, 0.803816}, {0.583004, 0.91555}, {-0.748169, 0.210483},
{-0.553528, -0.967036}, {0.316709, -0.153861}, {-0.79267, 0.585945},
{-0.700164, -0.750994}, {0.452273, -0.604434}, {-0.79134, -0.249902},
{-0.594918, -0.397574}, {-0.547371, -0.434041}, {0.958132, -0.499614},
{0.039941, 0.0990732}, {-0.891471, -0.464943}, {0.513187, -0.457062},
{-0.930053, 0.60341}, {0.656995, 0.854205}}
出力:
{{1, -1}, {1, 1}, {0.583004, 0.91555}, {0.0361877, 0.803816},
{-0.930053, 0.60341}, {-0.891471, -0.464943}, {-0.700164, -0.750994},
{-0.553528, -0.967036}}
標準のコードゴルフ規則が適用されます。特別なジオメトリライブラリはありません。より短いコードが優先されます。
編集1
ここでは、MatLabやMathematicaのような、凸包ファインダーの事前にプログラムされたルーチンではなく、アルゴリズム的な答えを探しています。
編集2
コメントと追加情報への回答:
- 入力リストにあなたに合った最小数のポイントが含まれていると仮定できます。ただし、整列(サブセット)の適切な処理を確保する必要があります。
- 入力リストに繰り返しポイントが見つかる場合があります
- ポイントの最大数は、使用可能なメモリによってのみ制限される必要があります
- 「浮動小数点」について:サンプルで指定されているように、10進座標を持つ入力リストを処理できる必要があります。浮動小数点表現を使用してそれを行うことができます
。
2
MATLABがこれに勝つと予測しています。
—
ポールR
少なくとも3つのポイントがあると仮定できますか?ポイントが異なると仮定できますか?浮動小数点座標をサポートする必要がありますか?
—
ピーターテイラー
@PeterTaylorの例は、最後の答えが正しいことを示しています
—
ジョンドヴォルザーク
入力を上書きできますか?
—
ジョンドヴォルザーク
共線点を一貫して処理する際の問題は、丸めの問題があることです。私たちは間違いを犯すことを許されるべきです。
—
ジョンドヴォルザーク