Para normalizar um vector é para dimensioná-lo até um comprimento de 1 ( um vector de unidade ), enquanto se mantinha a direcção consistente.
Por exemplo, se quiséssemos normalizar um vetor com 3 componentes, u , primeiro encontraríamos seu comprimento:
| u | = sqrt (u x 2 + u y 2 + u z 2 )
... e, em seguida, dimensione cada componente por esse valor para obter um vetor de comprimento 1.
û = u ÷ | u |
O desafio
Sua tarefa é escrever um programa ou função que, dada uma lista não vazia de números inteiros assinados, interprete-o como um vetor e o normalize. Isso deve funcionar para qualquer número de dimensões, por exemplo (casos de teste arredondados para duas casas decimais):
[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]
Regras:
- Você pode assumir que a lista de entrada irá:
- Ter pelo menos um elemento diferente de zero
- Contém apenas números dentro do intervalo de ponto flutuante padrão do seu idioma
- Sua saída deve ser precisa com pelo menos duas casas decimais . Também é permitido o retorno de frações / valores simbólicos de "precisão infinita", se é assim que seu idioma armazena os dados internamente.
- Os envios devem ser um programa completo que execute E / S ou uma função. Os envios de funções podem retornar uma nova lista ou modificar a lista fornecida no local.
- Funções / classes de vetores incorporadas são permitidas. Além disso, se o seu idioma tiver um tipo de vetor que suporte um número arbitrário de dimensões, você poderá usar um deles como entrada.
Como é um concurso de código-golfe , você deve ter como objetivo alcançar a solução mais curta possível (em bytes).
fonte
Respostas:
05AB1E , 4 bytes
Código:
Experimente online!
Explicação
fonte
JavaScript (ES6), 31 bytes
Casos de teste
Mostrar snippet de código
fonte
Mathematica, 9 bytes
Experimente online!
fonte
#/Norm@#&
para a mesma contagem de bytes.J , 8 bytes
Experimente online!
6 bytes
%|@j./
funcionam se o vetor for pelo menos bidimensional .fonte
%1%:@#.*:
Geléia ,
53 bytesExperimente online! ou veja a suíte de testes
Economizou 2 bytes graças a milhas!
fonte
÷ÆḊ
Oitava , 13 bytes
Experimente online!
fonte
C,
7370 bytesAgradecemos a @Christoph por salvar um byte!
Experimente online!
fonte
s=0,i=0
em vez des=i=0
salva ums[-i]
mas infelizmente*--v/=sqrt(s);
é 1 byte mais curto.s
ei
são automaticamente inicializados para 0. (Acontece que eu não precisam para inicializari
na função, porque a função sempre deixa-lo pelo valor 0)v[-i]
obtê-los na ordem correta.Python,
4746 bytesExperimente online!
fonte
Julia , 9 bytes
Experimente online!
fonte
CJam , 9 bytes
Experimente online!
Explicação
fonte
TI-Basic, 6 bytes
Corra com
{1,2,3}:prgmNAME
, onde{1,2,3}
é o vetor a ser normalizado.Divide cada elemento no vetor pela raiz quadrada da soma dos quadrados de seus elementos.
fonte
R , 23 bytes
Experimente online!
v%*%v
calcula o produto escalar de v com ele mesmo.A função emitirá um aviso para vetores de comprimento 2 ou superior.
fonte
Java (OpenJDK 8) , 57 bytes
Experimente online!
fonte
MATL , 5 bytes
Experimente online!
Não tenho certeza absoluta de que essa é a maneira mais curta de fazer isso. Em primeiro lugar, nós duplicar a entrada, em seguida, seleccionar o segundo tipo de saída
|
(que ou éabs
,norm
oudeterminant
). Finalmente, dividimos a entrada pela norma.Alternativa para 7 bytes:
fonte
Haskell , 29 bytes
Experimente online!
Ou por 1 byte a mais sem ponto:
map=<<flip(/).sqrt.sum.map(^2)
fonte
Funky , 42 bytes
Experimente online!
fonte
Ohm v2 , 5 bytes
Experimente online!
fonte
C ++ (gcc), 70 bytes
Entrada por
std::valarray<float>
. Substitui o vetor original.Experimente online!
fonte
#import
trabalha pelo menos com GCC, Clang e MinGW. Mas, sim, não é C ++ padrão.Lisp comum, 69 bytes
Experimente online!
fonte
APL (Dyalog) ,
131210 bytes1 byte salvo graças a @ Adám
2 bytes salvos graças a @ngn
Experimente online!
Quão?
fonte
⊢÷.5*⍨(+/×⍨)
∘
se não deriva). Fora isso, apenas troque⍺
e⍵
for⊣
e⊢
:{⍵÷.5*⍨+/×⍨⍵}
→{⍵÷.5*⍨(+/(×⍨⍵))}
→⊢÷.5*⍨(+/(×⍨⊢))
→⊢÷.5*⍨(+/(×⍨))
→⊢÷.5*⍨(+/×⍨)
(+/×⍨)
->+.×⍨
Casca ,
87 bytesExperimente online!
fonte
C # (.NET Core) , 51 + 64 = 115 bytes
Experimente online!
+64 bytes para o
using System;using System.Collections.Generic;using System.Linq;
C # (.NET Core) , 94 + 13 = 107 bytes
Experimente online!
+13 bytes para
using System;
A abordagem não-Linq
DeGolfed
fonte
Perl 5 , 45 + 1 (
-a
) = 46 bytesExperimente online!
fonte
Pip , 10 bytes
9 bytes de código, +1 para
-p
sinalizador.Toma o vetor como argumentos separados da linha de comando. Experimente online!
Como funciona
fonte
Pitão, 5 bytes
Experimente online: Conjunto de Testes
Explicação:
fonte
Perl 6 , 25 bytes
Experimente online!
$_
, o argumento da lista para a função, é dividido elementwise (»/»
) pela raiz quadrada da soma dos quadrados dos elementos (»²
).fonte
Ruby,
3935 bytes-4 bytes graças a G B.
fonte
sum{...}
vez demap{...}.sum
APL NARS 12 caracteres
fonte
f←
na sua contagem de bytes, pois você pode usar o dfns sem ele. A propósito, existe√
um único byte no NARS? Eu não estou familiarizado com isso, então só perguntoPlanilhas Google, 65 bytes
A lista de entrada está na coluna
A
com uma entrada por célula. É assim que as planilhas normalmente usam listas. Infelizmente, isso normalmente resultaria em uma longa lista de,0,0,0,0,0,....
no final, então temos que ignorar aqueles com aIf Blank then Blank else Math
lógica.Se tudo estivesse em uma célula, a solução seria 95 bytes:
fonte
Swift 4, 44 bytes
Recalcula a norma de vetor para cada componente, mas pelo menos é concisa!
fonte