Kase Kazık Yüksekliği
Bu bulmacanın amacı, bir kase yığını yüksekliğini hesaplamaktır.
Bir kase, kalınlığı olmayan radyal simetrik bir cihaz olarak tanımlanır. Siluet şekli eşit bir polinomdur. Yığın, her biri eşit bir polinom ile ilişkili olan ve bir katsayı listesi olarak girdi olarak verilen bir yarıçap listesi ile tanımlanır (örneğin, liste 3.1 4.2
polinom temsil eder ).
Polinom keyfi bir dereceye sahip olabilir. Basitlik için, yığının yüksekliği en üstteki kasenin merkezinin yüksekliği olarak tanımlanır (bir örnek için Örnek 3'teki çizime bakın).
Test senaryoları biçimindedir radius:coeff1 coeff2 ...
: her satır, kabın yarıçapını temsil eden bir kayan sayı ile başlar, ardından bir kolon ve çift güçler için katsayıları içeren, güç 2 ile başlayarak (sıfır sabit kısım ima edilir) . Örneğin, çizgi 2.3:3.1 4.2
yarıçapı 2.3
ve şekil-polinomunu tanımlar 3.1 * x^2 + 4.2 * x^4
.
örnek 1
42:3.141
Tek bir kazanın yüksekliği olmadığı için sıfır yükseklikte bir yığın tarif eder.
ÖRNEK 2
1:1 2
1.2:5
1:3
yükseklik yığınını tanımlar 2.0
(çizime bakınız).
ÖRNEK 3
1:1.0
0.6:0.2
0.6:0.4
1.4:0.2
0.4:0 10
Yükseklik 0.8 yığını tarif eder (arsadaki yeşil oka bakınız).
Bu kod golf, bu yüzden en kısa kod kazanır.
Ben referans kodu .
Düzenle:
Referans uygulaması, polinomların köklerini hesaplamak için bir kütüphaneye dayanmaktadır. Bunu da yapabilirsiniz ama buna gerek yok. Referans uygulaması sadece (oldukça iyi) bir sayısal yaklaşım olduğundan, ortak kayan nokta toleransları içinde doğru sonuçlar üreten herhangi bir kodu kabul edeceğim.
Bu bulmacanın bir başka çeşidi, kaseleri yeniden sıralayarak yüksekliği en aza indirmektir. Hızlı bir çözüm olup olmadığından emin değilim (sanırım NP zor). Herkes daha iyi bir fikre sahipse (ya da NP tamlığını ispatlayabilirse), lütfen bana söyleyin!
is_maximum
örneğin olması gerektiğine inanıyorum return evaluate(differentiate(shape_0), root) > 0.0
. Şu anda, dd
her zaman 0 (kökler için) döndürmesi gereken kökü (şekiller arasındaki farkın türevi) kullanarak değerlendirir . Nokta hatalarını Kayan nedeniyle, sonuç bazen olumlu değerdir yakın kodu doğru ya da daha doğru bir sonuç verir, bu yüzden de 0 olarak bazı zaman. 1:0.2, 1:0.1 0.2
Çıktı alması gereken girişi kontrol edin0.0125
0.801
. Son iki kase yarıçapta temas eder 0.1
.