Altura da pilha da tigela
O objetivo deste quebra-cabeça é calcular a altura de uma pilha de tigelas.
Uma tigela é definida como um dispositivo radialmente simétrico sem espessura. Seu formato de silhueta é um polinômio uniforme. A pilha é descrita por uma lista de raios, cada um associado a um polinômio par, dado como entrada como uma lista de coeficientes (por exemplo, a lista 3.1 4.2
representa o polinômio ).
O polinômio pode ter grau arbitrário. Por uma questão de simplicidade, a altura da pilha é definida como a altitude do centro da tigela superior (consulte a ilustração do Exemplo 3 para uma ilustração).
Os casos de teste estão no formato radius:coeff1 coeff2 ...
: cada linha começa com um número flutuante que representa o raio da tigela, seguido por dois pontos e uma lista separada por espaços contendo os coeficientes das potências pares, começando com a potência 2 (parte constante zero está implícita) . Por exemplo, a linha 2.3:3.1 4.2
descreve uma tigela de raio 2.3
e o polinômio de forma 3.1 * x^2 + 4.2 * x^4
.
Exemplo 1
42:3.141
descreve uma pilha de altura zero, pois uma única tigela não tem altura.
Exemplo 2
1:1 2
1.2:5
1:3
descreve uma pilha de altura 2.0
(ver gráfico).
Exemplo 3
1:1.0
0.6:0.2
0.6:0.4
1.4:0.2
0.4:0 10
descreve uma pilha de altura 0,8 (veja a seta verde no gráfico).
Isso é código de golfe, então o código mais curto vence.
Eu tenho código de referência .
Editar:
A implementação de referência depende de uma biblioteca para calcular as raízes dos polinômios. Você pode fazer isso também, mas não precisa. Como a implementação de referência é apenas uma aproximação numérica (muito boa), aceitarei qualquer código que produza resultados corretos dentro de tolerâncias comuns de ponto flutuante.
Outra variante desse quebra-cabeça é minimizar a altura reordenando as taças. Não tenho certeza se existe uma solução rápida (acho que é NP-difícil). Se alguém tiver uma ideia melhor (ou puder provar a completude do NP), diga-me!
is_maximum
deveria ser, por exemplo return evaluate(differentiate(shape_0), root) > 0.0
. Atualmente, avalia a raiz usando dd
(derivada da diferença entre formas), que sempre deve retornar 0 (para raízes). Devido a erros de ponto flutuante, o resultado é ocasionalmente um valor positivo próximo de 0, razão pela qual o código gera um resultado correto ou mais preciso algumas vezes. Verifique a entrada 1:0.2, 1:0.1 0.2
que deve gerar0.0125
0.801
. As duas tigelas finais tocam no raio 0.1
.