Lihatlah gambar ini. Secara khusus, pada bagaimana lubang di ujungnya diatur.
( Sumber gambar )
Perhatikan bagaimana pipa di gambar ini dikemas dalam pola heksagonal. Diketahui bahwa dalam 2D, kisi heksagonal adalah kemasan lingkaran yang paling padat. Dalam tantangan ini, kami akan fokus pada meminimalkan keliling kemasan lingkaran. Salah satu cara yang berguna untuk memvisualisasikan perimeter adalah membayangkan meletakkan karet gelang di sekitar kumpulan lingkaran.
Tugas
Dengan bilangan bulat positif n
sebagai input, tunjukkan kumpulan n
lingkaran yang dikemas sekencang mungkin.
Aturan dan Klarifikasi
- Asumsikan lingkaran memiliki diameter 1 unit.
- Variabel yang akan diminimalkan adalah panjang perimeter, yang didefinisikan sebagai lambung cembung dari pusat lingkaran dalam grup. Lihatlah gambar ini:
Tiga lingkaran dalam garis lurus memiliki perimeter 4 (cembung cembung adalah persegi panjang 2x0, dan 2 dihitung dua kali), yang disusun dalam sudut 120 derajat memiliki perimeter sekitar 3,85, dan segitiga memiliki perimeter hanya 3 unit. Perhatikan bahwa saya mengabaikan unit pi tambahan yang perimeter sebenarnya karena saya hanya melihat pusat lingkaran, bukan tepi mereka.
- Mungkin ada (dan hampir pasti akan) beberapa solusi untuk setiap yang diberikan
n
. Anda dapat menampilkan semua ini atas kebijakan Anda. Orientasi tidak masalah. - Lingkaran harus pada kisi heksagonal.
- Lingkaran harus berdiameter minimal 10 piksel, dan dapat diisi atau tidak.
- Anda dapat menulis program atau fungsi.
- Input dapat diambil melalui STDIN, sebagai argumen fungsi, atau setara terdekat.
- Output dapat ditampilkan atau output ke file.
Contohnya
Di bawah ini saya memiliki contoh output yang valid dan tidak valid untuk n dari 1 hingga 10 (contoh yang valid hanya untuk lima yang pertama). Contoh yang valid ada di sebelah kiri; setiap contoh di sebelah kanan memiliki perimeter lebih besar dari contoh valid yang sesuai.
Terima kasih banyak kepada steveverrill atas bantuannya menulis tantangan ini. Selamat packing!
sumber
Jawaban:
Mathematica
295950 byteCatatan: Versi yang masih harus di-golf ini membahas masalah yang diangkat oleh Steve Merrill tentang upaya saya sebelumnya.
Meskipun ini merupakan peningkatan dari versi pertama, ia tidak akan menemukan konfigurasi handle terpadat di mana orang akan mencari bentuk keseluruhan yang melingkar, bukannya heksagonal.
Ia menemukan solusi dengan membangun segi enam bagian dalam yang lengkap (untuk n> = 6, dan kemudian memeriksa semua konfigurasi untuk melengkapi kulit terluar dengan lingkaran yang tersisa.
Menariknya, seperti yang dicatat Steve Merrill dalam komentar, solusi untuk
n+1
lingkaran tidak selalu terdiri dari solusi untuk n lingkaran dengan lingkaran lain ditambahkan. Bandingkan solusi yang diberikan untuk 30 lingkaran dengan solusi yang diberikan untuk 31 lingkaran. (Catatan: ada solusi unik untuk 30 lingkaran.)Beberapa cek mensyaratkan perbandingan lebih dari seratus ribu kasus untuk nilai tunggal n (termasuk simetri). Butuh waktu sekitar 5 menit untuk menjalankan total 34 kasus uji. Tak perlu dikatakan, dengan lebih besar
n's
pendekatan brute-force ini akan segera terbukti tidak praktis. Pendekatan yang lebih efisien pasti ada.Angka-angka di sebelah kanan setiap kemasan adalah batas masing-masing lambung cembung biru. Di bawah ini adalah output untuk
3 < n < 35
. Lingkaran merah adalah yang ditambahkan di sekitar segi enam biasa.sumber