Tinggi Tumpukan Mangkuk
Tujuan dari teka-teki ini adalah untuk menghitung ketinggian setumpuk mangkuk.
Mangkuk didefinisikan sebagai perangkat simetris radial tanpa ketebalan. Bentuk siluetnya bahkan polinomial. Tumpukan dijelaskan oleh daftar jari-jari, masing-masing terkait dengan polinomial genap, diberikan sebagai input sebagai daftar koefisien (mis. Daftar tersebut 3.1 4.2
merepresentasikan polinomial ).
Polinomial mungkin memiliki tingkat arbitrer. Untuk kesederhanaan, ketinggian tumpukan didefinisikan sebagai ketinggian tengah mangkuk paling atas (lihat plot Contoh 3 untuk ilustrasi).
Kasus uji dalam format radius:coeff1 coeff2 ...
: setiap baris dimulai dengan angka float yang mewakili jari-jari mangkuk, diikuti oleh titik dua dan daftar yang dipisahkan ruang yang berisi koefisien untuk kekuatan genap, dimulai dengan daya 2 (nol bagian konstan tersirat) . Misalnya, garis 2.3:3.1 4.2
menggambarkan semangkuk jari-jari 2.3
dan bentuk-polinomial3.1 * x^2 + 4.2 * x^4
.
Contoh 1
42:3.141
menggambarkan tumpukan tinggi nol karena mangkuk tunggal tidak memiliki ketinggian.
Contoh 2
1:1 2
1.2:5
1:3
menggambarkan tumpukan tinggi 2.0
(lihat plot).
Contoh 3
1:1.0
0.6:0.2
0.6:0.4
1.4:0.2
0.4:0 10
menjelaskan tumpukan tinggi 0,8 (lihat panah hijau di plot).
Ini kode golf, jadi kode terpendek menang.
Saya punya kode referensi .
Edit:
Implementasi referensi bergantung pada perpustakaan untuk menghitung akar polinomial. Anda dapat melakukannya juga tetapi Anda tidak perlu melakukannya. Karena implementasi referensi hanya merupakan pendekatan numerik (cukup baik), saya akan menerima kode apa pun yang menghasilkan hasil yang benar dalam toleransi floating-point umum.
.
Varian lain dari teka-teki ini adalah meminimalkan ketinggian dengan menata ulang mangkuk. Saya tidak yakin apakah ada solusi cepat (saya kira ini NP-hard). Jika ada yang punya ide yang lebih baik (atau bisa membuktikan kelengkapan NP), tolong katakan padaku!
is_maximum
seharusnya eg return evaluate(differentiate(shape_0), root) > 0.0
. Saat ini, ia mengevaluasi penggunaan root dd
(turunan dari perbedaan antara bentuk), yang harus selalu mengembalikan 0 (untuk root). Karena kesalahan floating point, hasilnya kadang-kadang nilai positif dekat dengan 0, itulah sebabnya kode menghasilkan hasil yang benar atau lebih akurat beberapa waktu. Periksa input 1:0.2, 1:0.1 0.2
yang akan menampilkan0.0125
0.801
. Dua mangkuk terakhir menyentuh jari-jari 0.1
.