Altura de pila de tazón
El objetivo de este rompecabezas es calcular la altura de una pila de cuencos.
Un cuenco se define como un dispositivo radialmente simétrico sin espesor. Su forma de silueta es un polinomio uniforme. La pila se describe mediante una lista de radios, cada uno asociado con un polinomio par, dado como entrada como una lista de coeficientes (por ejemplo, la lista 3.1 4.2
representa el polinomio ).
El polinomio puede tener un grado arbitrario. Para simplificar, la altura de la pila se define como la altitud del centro del tazón más alto (vea el diagrama del Ejemplo 3 para una ilustración).
Los casos de prueba están en el formato radius:coeff1 coeff2 ...
: cada línea comienza con un número flotante que representa el radio del tazón, seguido de dos puntos y una lista separada por espacios que contiene los coeficientes para las potencias pares, comenzando con la potencia 2 (implica una parte constante de cero) . Por ejemplo, la línea 2.3:3.1 4.2
describe un tazón de radio 2.3
y el polinomio de forma 3.1 * x^2 + 4.2 * x^4
.
Ejemplo 1
42:3.141
describe un montón de altura cero ya que un solo tazón no tiene altura.
Ejemplo 2
1:1 2
1.2:5
1:3
describe un montón de altura 2.0
(ver diagrama).
Ejemplo 3
1:1.0
0.6:0.2
0.6:0.4
1.4:0.2
0.4:0 10
describe un montón de altura 0.8 (ver flecha verde en la gráfica).
Este es el código de golf, por lo que gana el código más corto.
Tengo codigo de referencia .
Editar:
La implementación de referencia se basa en una biblioteca para calcular las raíces de los polinomios. Puede hacer eso también, pero no es necesario. Dado que la implementación de referencia es solo una aproximación numérica (bastante buena), aceptaré cualquier código que produzca resultados correctos dentro de las tolerancias de punto flotante comunes.
Otra variante de este rompecabezas es minimizar la altura reordenando los tazones. No estoy seguro de si hay una solución rápida (supongo que es NP-hard). Si alguien tiene una mejor idea (o puede probar que NP está completa), ¡dígamelo!
is_maximum
debería ser, por ejemplo return evaluate(differentiate(shape_0), root) > 0.0
. Actualmente, evalúa la raíz utilizando dd
(derivada de la diferencia entre formas), que siempre debe devolver 0 (para raíces). Debido a errores de coma flotante, el resultado es ocasionalmente un valor positivo cercano a 0, razón por la cual el código genera un resultado correcto o más preciso en algunas ocasiones. Verifique la entrada 1:0.2, 1:0.1 0.2
que debería salir0.0125
0.801
. Los dos tazones finales se tocan en radio 0.1
.