Hauteur de la pile du bol
Le but de ce puzzle est de calculer la hauteur d'une pile de bols.
Un bol est défini comme étant un dispositif radialement symétrique sans épaisseur. Sa forme silhouette est un polynôme uniforme. L'empilement est décrit par une liste de rayons, chacun associé à un polynôme pair, donné en entrée sous forme de liste de coefficients (par exemple, la liste 3.1 4.2
représente le polynôme ).
Le polynôme peut avoir un degré arbitraire. Par souci de simplicité, la hauteur du tas est définie comme l'altitude du centre du bol le plus haut (voir le graphique de l'exemple 3 pour une illustration).
Les cas de test sont au format radius:coeff1 coeff2 ...
: chaque ligne commence par un nombre flottant représentant le rayon du bol, suivi par deux points et une liste séparée par des espaces contenant les coefficients pour les puissances paires, en commençant par la puissance 2 (zéro partie constante est impliquée) . Par exemple, la ligne 2.3:3.1 4.2
décrit un bol de rayon 2.3
et le polynôme de forme 3.1 * x^2 + 4.2 * x^4
.
Exemple 1
42:3.141
décrit un tas de hauteur nulle puisqu'un seul bol n'a pas de hauteur.
Exemple 2
1:1 2
1.2:5
1:3
décrit un tas de hauteur 2.0
(voir graphique).
Exemple 3
1:1.0
0.6:0.2
0.6:0.4
1.4:0.2
0.4:0 10
décrit un tas de hauteur 0,8 (voir flèche verte dans l'intrigue).
C'est le golf de code, donc le code le plus court gagne.
J'ai un code de référence .
Éditer:
L'implémentation de référence s'appuie sur une bibliothèque pour calculer les racines des polynômes. Vous pouvez également le faire, mais vous n'en avez pas besoin. Étant donné que l'implémentation de référence n'est qu'une (assez bonne) approximation numérique, j'accepterai tout code qui produit des résultats corrects dans les tolérances à virgule flottante courantes.
Une autre variante de ce puzzle est de minimiser la hauteur en réorganisant les bols. Je ne sais pas s'il y a une solution rapide (je suppose que c'est NP-difficile). Si quelqu'un a une meilleure idée (ou peut prouver l'exhaustivité de NP), dites-le moi!
is_maximum
devrait être par exemple return evaluate(differentiate(shape_0), root) > 0.0
. Actuellement, il évalue la racine en utilisant dd
(dérivée de la différence entre les formes), qui devrait toujours retourner 0 (pour les racines). En raison d'erreurs en virgule flottante, le résultat est parfois une valeur positive proche de 0, c'est pourquoi le code génère un résultat correct ou plus précis parfois . Vérifiez l'entrée 1:0.2, 1:0.1 0.2
qui doit sortir0.0125
0.801
. Les deux derniers bols se touchent au rayon 0.1
.