Diberikan daftar koordinat bilangan bulat, temukan area poligon cembung terbesar yang dapat Anda buat dari daftar sedemikian rupa sehingga -
- setiap titik ada di daftar
- tidak ada elemen daftar yang terkandung dalam poligon.
Contoh:
(0, 0) (8, 0) (0, 1) (3, 1) (7, 1) (1, 2) (5, 2) (9, 2) (2, 3) (2, 3) (5, 3) (7, 3) (3, 4) (5, 5) (11, 5)
Divisualisasikan:
o o
o o o
o o o
o o o
o
o o
Poligon cembung terbesar yang dapat Anda buat dari ini adalah ini:
o
o o
o o
o o
o
o
Dengan luas 12.
Anda dapat mengambil daftar koordinat dalam format yang masuk akal, dan harus menampilkan (dengan cara yang sesuai untuk bahasa pilihan Anda) bidang poligon cembung terbesar, dibulatkan menjadi tidak kurang dari 2 digit setelah titik desimal.
Selain itu, Anda harus menggunakan semacam algoritma, dan tidak hanya memaksa semua subset poin. Untuk menegakkan ini, program Anda harus menyelesaikan daftar 50 simpul dalam waktu kurang dari satu menit pada PC modern.
Kode terpendek dalam byte menang.
Jawaban:
Javascript ES6, 738 byte
Berikut adalah versi ES5 atau kurang yang seharusnya berfungsi di sebagian besar peramban dan simpul tanpa mengubah: 827 byte
Kode mengembalikan fungsi anonim. Sebagai parameter, dibutuhkan array poin, seperti
[[0,1],[2,3],[4,5]]
. Untuk menggunakannya, Anda dapat meletakkannya divar f=
depan, atau jika Anda ingin menggunakannya dari baris perintah, tambahkan(process.argv[2].replace(/ /g,'').slice(1,-1).split(')(').map((x)=>x.split(',')))
sampai akhir, dan panggil sepertinode convpol.js '(1,2)(3,4)(5,6)'
Terima kasih atas tantangannya! Karena tidak ada implementasi referensi, saya tidak dapat membuktikan ini benar, tetapi konsisten setidaknya untuk permutasi dari daftar poin. Saya hampir tidak berpikir ini akan berhasil, karena versi dengan kode debugging, bahkan dinonaktifkan, terlalu lambat dengan peningkatan waktu yang eksponensial. Saya memutuskan untuk golf itu, dan senang melihat bahwa itu turun menjadi di bawah 2 detik untuk 50 poin pada mesin saya. Itu dapat menghitung sekitar 130 poin dalam 1 menit.
Algoritma ini mirip dengan pemindaian Graham , kecuali bahwa ia harus mencari lambung cembung kosong di mana-mana.
Penjelasan
Berikut ini ikhtisar tingkat tinggi tentang cara kerja algoritme. Daging dari algoritma ini hanya mencari loop cembung berlawanan arah jarum jam yang tidak menyertakan titik. Prosedurnya kira-kira seperti ini:
Juga, sebagai pengoptimalan, kami merekam pasangan awal rantai sebagai dicentang, sehingga setiap pencarian setelah melihat pasangan ini di mana saja dalam rantai dapat segera berhenti mencari, karena poligon terbesar dengan pasangan ini telah ditemukan.
Algoritma ini seharusnya tidak pernah menemukan poligon dua kali, dan saya telah secara eksperimental memverifikasi ini.
sumber
===
dan!==
dengan==
dan!=
, tetapi saya tidak bisa memastikan tanpa memahami kode Anda ...(x,i)=>p.i==i
(13 karakter) sedikit lebih lama darix=>p===x
(8 karakter) bahkan setelah optimasi.