Per normalizzare un vettore è in scala ad una lunghezza di 1 ( un vettore unitario ), mantenendo la direzione coerente.
Ad esempio, se volessimo normalizzare un vettore con 3 componenti, u , troveremmo prima la sua lunghezza:
| u | = sqrt (u x 2 + u y 2 + u z 2 )
... e quindi ridimensionare ciascun componente di questo valore per ottenere un vettore di lunghezza 1.
û = u ÷ | u |
La sfida
Il tuo compito è scrivere un programma o una funzione che, dato un elenco non vuoto di numeri interi con segno, lo interpreta come un vettore e lo normalizzi. Questo dovrebbe funzionare per qualsiasi numero di dimensioni, ad esempio (casi di test arrotondati al secondo decimale):
[20] -> [1]
[-5] -> [-1]
[-3, 0] -> [-1, 0]
[5.5, 6, -3.5] -> [0.62, 0.68, -0.40]
[3, 4, -5, -6] -> [0.32, 0.43, -0.54, -0.65]
[0, 0, 5, 0] -> [0, 0, 1, 0]
Regole:
- Puoi presumere che l'elenco di input:
- Avere almeno un elemento diverso da zero
- Contiene solo numeri all'interno dell'intervallo standard in virgola mobile della tua lingua
- L'output deve essere accurato con almeno due cifre decimali . Restituire anche frazioni / valori simbolici di "precisione infinita" è consentito, se è così che la tua lingua memorizza internamente i dati.
- Gli invii dovrebbero essere un programma completo che esegue I / O o una funzione. Gli invii di funzioni possono restituire un nuovo elenco o modificare il dato elenco in atto.
- Sono consentite funzioni / classi vettoriali incorporate. Inoltre, se la tua lingua ha un tipo vettoriale che supporta un numero arbitrario di dimensioni, puoi prenderne una come input.
Questa è una gara di code-golf , quindi dovresti mirare a raggiungere la soluzione più breve possibile (in byte).