Stapelhöhe der Schüssel
Das Ziel dieses Puzzles ist es, die Höhe eines Schalenstapels zu berechnen.
Eine Schüssel ist definiert als eine radialsymmetrische Vorrichtung ohne Dicke. Seine Silhouetteform ist ein gleichmäßiges Polynom. Der Stapel wird durch eine Liste von Radien beschrieben, die jeweils einem geraden Polynom zugeordnet sind und als eine Liste von Koeffizienten eingegeben werden (z. B. 3.1 4.2
repräsentiert die Liste das Polynom ).
Das Polynom kann einen beliebigen Grad haben. Der Einfachheit halber ist die Höhe des Stapels als die Höhe des Mittelpunkts der obersten Schüssel definiert (siehe Diagramm von Beispiel 3 für eine Illustration).
Testfälle haben das Format radius:coeff1 coeff2 ...
: Jede Zeile beginnt mit einer Gleitkommazahl, die den Radius der Schüssel darstellt, gefolgt von einem Doppelpunkt und einer durch Leerzeichen getrennten Liste mit den Koeffizienten für die geraden Potenzen, beginnend mit Potenz 2 (der konstante Nullteil ist impliziert). . Beispielsweise 2.3:3.1 4.2
beschreibt die Linie eine Schale mit Radius 2.3
und das Formpolynom 3.1 * x^2 + 4.2 * x^4
.
Beispiel 1
42:3.141
beschreibt einen Stapel mit einer Höhe von Null, da eine einzelne Schüssel keine Höhe hat.
Beispiel 2
1:1 2
1.2:5
1:3
beschreibt einen Haufen Höhe 2.0
(siehe Grafik).
Beispiel 3
1:1.0
0.6:0.2
0.6:0.4
1.4:0.2
0.4:0 10
beschreibt einen Stapel mit einer Höhe von 0,8 (siehe grüner Pfeil in der Zeichnung).
Dies ist Codegolf, also gewinnt der kürzeste Code.
Ich habe einen Referenzcode .
Bearbeiten:
Die Referenzimplementierung stützt sich auf eine Bibliothek, um die Wurzeln von Polynomen zu berechnen. Sie können das auch tun, müssen es aber nicht. Da es sich bei der Referenzimplementierung nur um eine (recht gute) numerische Näherung handelt, akzeptiere ich jeden Code, der innerhalb der üblichen Gleitkommatoleranzen korrekte Ergebnisse liefert.
Die Idee zählt. Ich interessiere mich nicht , wenn es kleine erros .
Eine andere Variante dieses Puzzles besteht darin, die Höhe zu minimieren, indem die Schalen neu angeordnet werden. Ich bin mir nicht sicher, ob es eine schnelle Lösung gibt (ich denke, es ist NP-schwer). Wenn jemand eine bessere Idee hat (oder die NP-Vollständigkeit nachweisen kann), sag es mir bitte!
is_maximum
zB sein sollte return evaluate(differentiate(shape_0), root) > 0.0
. Derzeit wird die Wurzel mit dd
(Ableitung des Unterschieds zwischen Formen) ausgewertet , wobei immer 0 (für Wurzeln) zurückgegeben werden sollte. Aufgrund Punktfehler schwimmen, ist das Ergebnis ein positiver Wert gelegentlich Schließen auf 0, weshalb gibt den Code ein korrektes oder genaueres Ergebnis einige der Zeit. Überprüfen Sie den Eingang, 1:0.2, 1:0.1 0.2
der ausgegeben werden soll0.0125
0.801
. Die letzten beiden Schalen berühren sich im Radius 0.1
.