Saat Anda memalu satu set paku ke papan kayu dan membungkus karet gelang di sekitarnya, Anda mendapatkan Convex Hull .
Misi Anda, jika Anda memutuskan untuk menerimanya, adalah menemukan Convex Hull dari sekumpulan poin 2D.
Beberapa peraturan:
- Tuliskan sebagai fungsi, daftar titik terkoordinasi (dalam format apa pun yang Anda inginkan) adalah argumennya
- Keluaran harus berupa daftar titik-titik dalam cembung yang terdaftar searah atau berlawanan arah jarum jam, mulai dari salah satu dari mereka
- Daftar keluaran dapat dalam format yang masuk akal di mana koordinat setiap titik dapat dibedakan dengan jelas. (Misalnya BUKAN satu daftar redup {0,1, 1,3, 4, ...})
- Jika tiga atau lebih titik di segmen cembung cembung diselaraskan, hanya dua ekstrem yang harus disimpan pada output
Contoh data:
Contoh 0
Memasukkan:
{{1, 1}, {2, 2}, {3, 3}, {1, 3}}
Keluaran:
{{3, 3}, {1, 3}, {1, 1}}
(Angka-angka itu hanya ilustrasi)
Contoh 1
Memasukkan:
{{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}}
Keluaran:
{{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}}
Contoh 2
Memasukkan:
{{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}}
Keluaran:
{{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}}
Aturan standar kode-golf berlaku. Tidak ada perpustakaan geometri ad-hoc. Kode lebih pendek menang.
Edit 1
Kami mencari jawaban algoritmik di sini, bukan rutin pra-terprogram cembung finder yang diprogram seperti ini di MatLab atau yang ini di Mathematica
Edit 2
Menjawab komentar dan info tambahan:
- Anda dapat mengasumsikan daftar input berisi jumlah minimum poin yang cocok untuk Anda. Tetapi Anda harus memastikan perlakuan yang tepat untuk set (sub) yang selaras.
- Anda mungkin menemukan poin berulang dalam daftar input
- Jumlah maksimum poin harus dibatasi hanya oleh memori yang tersedia
- Re "floating point": Anda harus dapat memproses daftar input dengan koordinat desimal seperti yang diberikan dalam sampel. Anda bisa melakukannya dengan menggunakan representasi floating point
.
Jawaban:
Ruby, 168 karakter
Kode ruby ini juga menggunakan algoritma pembungkusan hadiah. Fungsi
C
menerima array titik dan mengembalikan lambung cembung sebagai array.Contoh:
sumber
Mathematica 151
masih bekerja dalam prosespengujian:
sumber
CoffeeScript, 276:
Jika fungsi tidak perlu diakses, hapus
f=
untuk mencukur dua karakter lagi.Input / output adalah array titik tunggal, dengan masing-masing titik ditentukan oleh
x,y
properti. Array input diubah, serta dikembalikan (jika yang terakhir tidak diperlukan, hapus dua karakter terakhir).Penjelasan dapat ditambahkan nanti.
Test suite (tidak akan berfungsi di oldIE):
lingkungan pengujian yang disarankan: http://coffeescript.org/
sumber
{{1, 1}, {2, 2}, {3, 3}, {1, 3}}
dan mengembalikannya[{"x" : 1, "y" : 1, "r" : 0}, {"x" : 1, "y" : 3, "r" : 0}, "x" : 2, "y" : 2, "r" : 0.78..}]
sementara saya pikir jawaban yang benar adalah permutasi dari{{3, 3}, {1, 3}, {1, 1}}
Python,
209 205195Menggunakan algoritma pembungkusan hadiah. Hasilnya dimulai dengan titik paling kiri dan membungkus berlawanan arah jarum jam.
Contoh:
h([(1, 1), (2, 2), (3, 3), (1, 3)])
kembali[(1, 3), (1, 1), (3, 3)]
sumber
print
untuk mendapatkan output?the output list can be in any reasonable format
sudah cukup jelas. Apakah Anda pikir itu perlu dinyatakan secara eksplisit?h([(0, 1), (0,1), (0.1 , 1)])
memberi saya[(0, 1), (0.10000000000000001, 1)]