Altezza del catino
L'obiettivo di questo puzzle è calcolare l'altezza di una pila di ciotole.
Una ciotola è definita come un dispositivo radialmente simmetrico senza spessore. La sua sagoma è un polinomio uniforme. Lo stack è descritto da un elenco di raggi, ciascuno associato a un polinomio pari, dato come input come un elenco di coefficienti (ad esempio, l'elenco 3.1 4.2rappresenta il polinomio ).
Il polinomio può avere un grado arbitrario. Per semplicità, l'altezza della pila è definita come l'altitudine del centro della ciotola più in alto (vedere la trama dell'esempio 3 per un'illustrazione).
I casi di test sono nel formato radius:coeff1 coeff2 ...: ogni riga inizia con un numero float che rappresenta il raggio della ciotola, seguito da due punti e un elenco separato da spazi contenente i coefficienti per le potenze pari, a partire dalla potenza 2 (è implicita la parte zero costante) . Ad esempio, la linea 2.3:3.1 4.2descrive una ciotola di raggio 2.3e il polinomio di forma 3.1 * x^2 + 4.2 * x^4.
Esempio 1
42:3.141
descrive una pila di altezza zero poiché una singola ciotola non ha altezza.
Esempio 2
1:1 2
1.2:5
1:3
descrive una pila di altezza 2.0(vedi trama).
Esempio 3
1:1.0
0.6:0.2
0.6:0.4
1.4:0.2
0.4:0 10
descrive una pila di altezza 0,8 (vedi freccia verde nella trama).
Questo è il codice golf, quindi vince il codice più corto.
Ho un codice di riferimento .
Modificare:
L'implementazione di riferimento si basa su una libreria per calcolare le radici dei polinomi. Puoi farlo anche tu, ma non è necessario. Poiché l'implementazione di riferimento è solo un'approssimazione numerica (abbastanza buona), accetterò qualsiasi codice che produca risultati corretti entro tolleranze in virgola mobile comuni.
L'idea conta. Non mi importa se ci sono piccoli errori .
Un'altra variante di questo puzzle è di minimizzare l'altezza riordinando le ciotole. Non sono sicuro che esista una soluzione rapida (suppongo sia NP-difficile). Se qualcuno ha un'idea migliore (o può dimostrare la completezza NP), per favore dimmelo!
is_maximumdovrebbe essere ad es return evaluate(differentiate(shape_0), root) > 0.0. Attualmente, valuta la radice usando dd(derivata della differenza tra le forme), che dovrebbe sempre restituire 0 (per le radici). A causa di errori in virgola mobile, il risultato è occasionalmente un valore positivo vicino a 0, motivo per cui il codice restituisce un risultato corretto o più accurato qualche volta. Controllare l'input 1:0.2, 1:0.1 0.2che dovrebbe emettere0.0125
0.801. Le ultime due ciotole si toccano al raggio 0.1.


