Wysokość stosu miski
Celem tej układanki jest obliczenie wysokości stosu misek.
Miska jest zdefiniowana jako promieniowo symetryczne urządzenie bez grubości. Jego sylwetka ma równomierny wielomian. Stos jest opisany przez listę promieni, z których każdy związany jest z parzystym wielomianem, podany jako dane wejściowe jako lista współczynników (np. Lista 3.1 4.2
reprezentuje wielomian ).
Wielomian może mieć dowolny stopień. Dla uproszczenia wysokość stosu definiuje się jako wysokość środka najwyżej położonej misy (ilustrację przedstawiono na wykresie w przykładzie 3).
Przypadki testowe mają format radius:coeff1 coeff2 ...
: każda linia zaczyna się od liczby zmiennoprzecinkowej reprezentującej promień misy, po której następuje dwukropek i lista oddzielona spacjami zawierająca współczynniki dla mocy parzystych, zaczynając od mocy 2 (implikowana jest zerowa część stała) . Na przykład linia 2.3:3.1 4.2
opisuje miskę o promieniu 2.3
i wielomian kształtu 3.1 * x^2 + 4.2 * x^4
.
Przykład 1
42:3.141
opisuje stos o zerowej wysokości, ponieważ pojedyncza miska nie ma wysokości.
Przykład 2
1:1 2
1.2:5
1:3
opisuje stos wysokości 2.0
(patrz działka).
Przykład 3
1:1.0
0.6:0.2
0.6:0.4
1.4:0.2
0.4:0 10
opisuje stos wysokości 0,8 (patrz zielona strzałka na wykresie).
To jest kod golfowy, więc wygrywa najkrótszy kod.
Mam kod referencyjny .
Edytować:
Implementacja referencyjna polega na bibliotece do obliczania pierwiastków wielomianów. Możesz to zrobić, ale nie musisz. Ponieważ implementacja referencyjna jest tylko (całkiem dobrym) przybliżeniem liczbowym, zaakceptuję każdy kod, który daje prawidłowe wyniki w ramach wspólnych tolerancji zmiennoprzecinkowych.
Innym wariantem tej układanki jest zminimalizowanie wysokości poprzez zmianę kolejności misek. Nie jestem pewien, czy istnieje szybkie rozwiązanie (myślę, że jest to trudne NP). Jeśli ktoś ma lepszy pomysł (lub może udowodnić kompletność NP), proszę mi powiedzieć!
is_maximum
powinno być np return evaluate(differentiate(shape_0), root) > 0.0
. Obecnie ocenia pierwiastek za pomocą dd
(pochodna różnicy między kształtami), która zawsze powinna zwracać 0 (dla pierwiastków). Ze względu na unoszące się błędy punkt, wynik jest czasami dodatnia wartość blisko 0, dlatego kod generuje poprawny lub bardziej dokładny wynik jakiś czas. Sprawdź dane wejściowe, 1:0.2, 1:0.1 0.2
które powinny zostać wyświetlone0.0125
0.801
. Dwie ostatnie miski dotykają się w promieniu 0.1
.