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.2
rappresenta 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.2
descrive una ciotola di raggio 2.3
e 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_maximum
dovrebbe 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.2
che dovrebbe emettere0.0125
0.801
. Le ultime due ciotole si toccano al raggio 0.1
.