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 exemplereturn evaluate(differentiate(shape_0), root) > 0.0
. Actuellement, il évalue la racine en utilisantdd
(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ée1:0.2, 1:0.1 0.2
qui doit sortir0.0125
0.801
. Les deux derniers bols se touchent au rayon0.1
.Réponses:
Gelée ,
5453 octetsEssayez-le en ligne!
Un lien monadique qui prend comme argument la liste des bols de haut en bas au format
[[b1_radius, b1_coef1, ...], [b2_radius, b2_coef1, ...]]
et renvoie la position y du bas du bol supérieur.Gère maintenant correctement les bols qui se rencontrent à des endroits autres que le rayon minimal.
Explication
Lien d'aide: prend comme argument de gauche
l
les différences de coefficients des polynômes représentant les bols de 1 vers le haut, et son argument de droiter
le rayon minimum; renvoie la valeur y maximale où les deux bols se rencontrentLien principal, prend une pile de bol comme argument et renvoie la valeur y de la base du bol supérieur
Référence Python
Enfin, voici une version TIO de la référence Python incluse @pasbi pour le problème principal. Il lit à partir de stdin.
la source
(r1, p1)
et(r2, p2)
au pointmin(r1, r2)
? Si c'est le cas, ce serait une mauvaise solution car deux bols peuvent se toucher entre0
etmin(r1, r2))
. Vous devez trouvermax(p1(x)-p2(x), 0)
sur toute la gamme[0, min(r1, r2)]
pourx
. C'est pourquoi la solution de référence de @ pasbi calcule des dérivées pour trouver le maximum local.min(r1, r2)
. Cela résout maintenant le défi supplémentaire de @ attinatPython 3 + numpy + scipy,
248240 octetsEssayez-le en ligne!
-8 octets grâce à @xnor
La fonction prend une liste de
[radius, polynomial]
paires en entrée et renvoie la hauteur de la pile.Cette solution utilise plus ou moins le même algorithme que le code de référence sauf qu'elle ne calcule pas le maximum à l'aide de dérivées. Pendant ce temps, il est écrit en utilisant les fonctions intégrées
numpy
etscipy
en Python. La version non golfée est illustrée ci-dessous. Cela sert de version alternative du code de référence pour ceux qui veulent une version plus courte pour capturer rapidement l'idée.Essayez-le en ligne!
la source
i=0
comme argument facultatif.Langue Wolfram (Mathematica) ,
10493 octetsEssayez-le en ligne!
Prend l'entrée sous forme de liste deX .
{radius, polynomial}
paires représentant des bols, avec des polynômes en termes dePour une sortie décimale au lieu d'une sortie symbolique, utilisez
NMaxValue
plutôt (ou appelez simplementN
le résultat).la source
R ,
451436 octetsEssayez-le en ligne!
Essayez-le en ligne!
D'une manière générale, un port R de ma réponse Jelly, bien que puisque la base R n'a pas de fonction pour trouver les racines des polynômes, cela est implémenté en utilisant la méthode trouvée dans
polynom::solve.polynomial
.Une fonction prenant une liste de vecteurs numériques de haut en bas de pile.
Merci à @RobinRyder d'avoir joué au golf sur 15 octets!
la source