Para normalizar un vector es la escala para una longitud de 1 ( un vector unitario ), manteniendo la dirección consistente.
Por ejemplo, si quisiéramos normalizar un vector con 3 componentes, u , primero encontraríamos su longitud:
| u | = sqrt (u x 2 + u y 2 + u z 2 )
... y luego escala cada componente por este valor para obtener un vector de longitud 1.
û = u ÷ | u |
El reto
Su tarea es escribir un programa o función que, dada una lista no vacía de enteros con signo, lo interprete como un vector y lo normalice. Esto debería funcionar para cualquier cantidad de dimensiones, por ejemplo (casos de prueba redondeados a dos decimales):
[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]
Reglas:
- Puede suponer que la lista de entrada:
- Tener al menos un elemento distinto de cero
- Solo contiene números dentro del rango de coma flotante estándar de su idioma
- Su salida debe tener una precisión de al menos dos decimales . También se permite devolver fracciones / valores simbólicos de "precisión infinita", si así es como su idioma almacena internamente los datos.
- Los envíos deben ser un programa completo que realice E / S o una función. Los envíos de funciones pueden devolver una nueva lista o modificar la lista dada en su lugar.
- Se permiten funciones / clases de vectores incorporados. Además, si su idioma tiene un tipo de vector que admite un número arbitrario de dimensiones, puede tomar una de estas como entrada.
Este es un concurso de código de golf , por lo que debe aspirar a lograr la solución más corta posible (en bytes).
code-golf
math
array-manipulation
geometry
FlipTack
fuente
fuente
Respuestas:
05AB1E , 4 bytes
Código:
Pruébalo en línea!
Explicación
fuente
JavaScript (ES6), 31 bytes
Casos de prueba
Mostrar fragmento de código
fuente
Mathematica, 9 bytes
Pruébalo en línea!
fuente
#/Norm@#&
por el mismo número de bytes.J , 8 bytes
Pruébalo en línea!
6 bytes
%|@j./
funcionan si el vector es al menos bidimensional .fuente
%1%:@#.*:
Jalea ,
53 bytesPruébalo en línea! o ver el conjunto de pruebas
¡Ahorró 2 bytes gracias a millas!
fuente
÷ÆḊ
Octava , 13 bytes
Pruébalo en línea!
fuente
C,
7370 bytes¡Gracias a @Christoph por guardar un byte!
Pruébalo en línea!
fuente
s=0,i=0
en lugar des=i=0
s[-i]
pero lamentablemente*--v/=sqrt(s);
es 1 byte más corto.s
yi
se inicializan automáticamente a 0. (Resulta que no necesito inicializari
en la función, porque la función siempre la deja en el valor 0)v[-i]
obtener los valores en el orden correcto.Python,
4746 bytesPruébalo en línea!
fuente
Julia , 9 bytes
Pruébalo en línea!
fuente
CJam , 9 bytes
Pruébalo en línea!
Explicación
fuente
TI-Basic, 6 bytes
Ejecutar con
{1,2,3}:prgmNAME
, donde{1,2,3}
es el vector a normalizar.Divide cada elemento en el vector por la raíz cuadrada de la suma de los cuadrados de sus elementos.
fuente
R , 23 bytes
Pruébalo en línea!
v%*%v
calcula el producto punto de v consigo mismo.La función emitirá una advertencia para vectores de longitud 2 o mayores.
fuente
Java (OpenJDK 8) , 57 bytes
Pruébalo en línea!
fuente
MATL , 5 bytes
Pruébalo en línea!
No estoy completamente seguro de que esta sea la forma más corta de hacerlo. Primero, duplicamos la entrada, luego seleccionamos el segundo tipo de salida de
|
(que esabs
,norm
odeterminant
). Finalmente, dividimos la entrada por la norma.Alternativa para 7 bytes:
fuente
Haskell , 29 bytes
Pruébalo en línea!
O para 1 byte más sin puntos:
map=<<flip(/).sqrt.sum.map(^2)
fuente
Funky , 42 bytes
Pruébalo en línea!
fuente
Ohm v2 , 5 bytes
Pruébalo en línea!
fuente
C ++ (gcc), 70 bytes
Entrada por
std::valarray<float>
. Sobrescribe el vector original.Pruébalo en línea!
fuente
#import
funciona al menos con GCC, Clang y MinGW. Pero, sí, no es C ++ estándar.Lisp común, 69 bytes
Pruébalo en línea!
fuente
APL (Dyalog) ,
131210 bytes1 byte guardado gracias a @ Adám
2 bytes guardados gracias a @ngn
Pruébalo en línea!
¿Cómo?
fuente
⊢÷.5*⍨(+/×⍨)
∘
si no se deriva). Aparte de eso, simplemente cambie⍺
y⍵
por⊣
y⊢
:{⍵÷.5*⍨+/×⍨⍵}
→{⍵÷.5*⍨(+/(×⍨⍵))}
→⊢÷.5*⍨(+/(×⍨⊢))
→⊢÷.5*⍨(+/(×⍨))
→⊢÷.5*⍨(+/×⍨)
(+/×⍨)
->+.×⍨
Casco ,
87 bytesPruébalo en línea!
fuente
C # (.NET Core) , 51 + 64 = 115 bytes
Pruébalo en línea!
+64 bytes para el
using System;using System.Collections.Generic;using System.Linq;
C # (.NET Core) , 94 + 13 = 107 bytes
Pruébalo en línea!
+13 bytes para
using System;
El enfoque no Linq
DeGolfed
fuente
Perl 5 , 45 + 1 (
-a
) = 46 bytesPruébalo en línea!
fuente
Pip , 10 bytes
9 bytes de código, +1 para
-p
bandera.Toma el vector como argumentos separados de la línea de comandos. Pruébalo en línea!
Cómo funciona
fuente
Pyth, 5 bytes
Pruébelo en línea: Test Suite
Explicación:
fuente
Perl 6 , 25 bytes
Pruébalo en línea!
$_
, el argumento de lista para la función, se divide elementwise (»/»
) por la raíz cuadrada de la suma de los cuadrados de los elementos (»²
).fuente
Ruby,
3935 bytes-4 bytes gracias a G B.
fuente
sum{...}
lugar demap{...}.sum
APL NARS 12 Personajes
fuente
f←
en su conteo de bytes, ya que puede usar los dfns sin él. Por cierto, ¿hay√
un solo byte en NARS? No estoy familiarizado con él, por lo que sólo pidiendoHojas de cálculo de Google, 65 bytes
La lista de entrada está en una columna
A
con una entrada por celda. Así es como las hojas de cálculo normalmente usarían listas. Desafortunadamente, esto normalmente daría como resultado una larga lista,0,0,0,0,0,....
al final, por lo que debemos ignorar a aquellos con laIf Blank then Blank else Math
lógica.Si todo estuviera en una celda, la solución sería 95 bytes:
fuente
Swift 4, 44 bytes
Recalcula la norma vectorial para cada componente, ¡pero al menos es conciso!
fuente