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!
sumber
is_maximum
seharusnya egreturn evaluate(differentiate(shape_0), root) > 0.0
. Saat ini, ia mengevaluasi penggunaan rootdd
(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 input1:0.2, 1:0.1 0.2
yang akan menampilkan0.0125
0.801
. Dua mangkuk terakhir menyentuh jari-jari0.1
.Jawaban:
Jelly ,
5453 byteCobalah online!
Tautan monadik yang mengambil argumennya daftar mangkuk dari atas ke bawah dalam format
[[b1_radius, b1_coef1, ...], [b2_radius, b2_coef1, ...]]
dan mengembalikan posisi y dari bagian bawah mangkuk atas.Sekarang dengan benar menangani mangkuk yang bertemu di tempat-tempat selain radius minimal.
Penjelasan
Helper link: mengambil sebagai argumen kiri
l
perbedaan koefisien dari polinomial yang mewakili mangkuk dari 1 ke atas, dan argumen kananr
jari-jari minimum; mengembalikan nilai y maksimum tempat kedua mangkuk bertemuTautan utama, mengambil tumpukan mangkuk sebagai argumennya dan mengembalikan nilai dasar mangkuk atas
Referensi Python
Akhirnya, inilah versi TIO dari referensi Python yang disertakan @pasbi untuk masalah utama. Bunyinya dari stdin.
sumber
(r1, p1)
dan(r2, p2)
pada intinyamin(r1, r2)
? Jika demikian, itu akan menjadi solusi yang salah karena dua mangkuk dapat menyentuh antara0
danmin(r1, r2))
. Anda perlu menemukanmax(p1(x)-p2(x), 0)
seluruh rentang[0, min(r1, r2)]
untukx
. Itulah sebabnya solusi referensi @ pasbi menghitung derivatif untuk menemukan maksimum lokal.min(r1, r2)
. Ini sekarang memecahkan tantangan tambahan @ attinatPython 3 + numpy + scipy,
248240 byteCobalah online!
-8 byte terima kasih kepada @xnor
Fungsi mengambil daftar
[radius, polynomial]
pasangan sebagai input dan mengembalikan ketinggian tiang.Solusi ini menggunakan kurang lebih algoritma yang sama dengan kode referensi kecuali bahwa itu tidak menghitung maksimum menggunakan derivatif. Sementara itu, ditulis menggunakan built-in
numpy
danscipy
fungsi dengan Python. Versi ungolfed ditampilkan sebagai berikut. Ini berfungsi sebagai versi alternatif dari kode referensi bagi mereka yang menginginkan versi yang lebih pendek untuk menangkap ide dengan cepat.Cobalah online!
sumber
i=0
sebagai argumen opsional.Bahasa Wolfram (Mathematica) ,
10493 byteCobalah online!
{radius, polynomial}
Untuk desimal alih-alih keluaran simbolis, gunakan
NMaxValue
sebagai gantinya (atau panggil sajaN
hasilnya).sumber
R ,
451436 byteCobalah online!
Cobalah online!
Secara garis besar port R dari jawaban Jelly saya, meskipun karena basis R tidak memiliki fungsi untuk menemukan akar polinomial ini diimplementasikan menggunakan metode yang ditemukan dalam
polynom::solve.polynomial
.Fungsi mengambil daftar vektor numerik dari atas ke bawah tumpukan.
Terima kasih kepada @RobinRyder untuk bermain golf 15 byte!
sumber