Pour normaliser un vecteur est à elle échelle à une longueur de 1 ( un vecteur unitaire ), tout en maintenant la direction cohérente.
Par exemple, si nous voulions normaliser un vecteur à 3 composantes, u , nous trouverions d'abord sa longueur:
| u | = sqrt (u x 2 + u y 2 + u z 2 )
... puis redimensionnez chaque composant selon cette valeur pour obtenir un vecteur de longueur 1.
û = u ÷ | u |
Le défi
Votre tâche consiste à écrire un programme ou une fonction qui, étant donné une liste non vide d'entiers signés, l'interprète comme un vecteur et le normalise. Cela devrait fonctionner pour n'importe quel nombre de dimensions, par exemple (cas de test arrondis à deux décimales):
[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]
Règles:
- Vous pouvez supposer que la liste de saisie:
- Avoir au moins un élément non nul
- Ne contient que des nombres dans la plage de virgule flottante standard de votre langue
- Votre sortie doit être précise à au moins deux décimales . Le retour de fractions / valeurs symboliques de «précision infinie» est également autorisé, si c'est ainsi que votre langue stocke en interne les données.
- Les soumissions doivent être soit un programme complet qui effectue des E / S, soit une fonction. Les soumissions de fonctions peuvent soit renvoyer une nouvelle liste, soit modifier la liste donnée en place.
- Les fonctions / classes vectorielles intégrées sont autorisées. De plus, si votre langue a un type de vecteur qui prend en charge un nombre arbitraire de dimensions, vous pouvez en prendre une en entrée.
Il s'agit d'un concours de code-golf , vous devez donc viser à obtenir la solution la plus courte possible (en octets).
la source
Réponses:
05AB1E , 4 octets
Code:
Essayez-le en ligne!
Explication
la source
JavaScript (ES6), 31 octets
Cas de test
Afficher l'extrait de code
la source
Mathematica, 9 octets
Essayez-le en ligne!
la source
#/Norm@#&
pour le même nombre d'octets.J , 8 octets
Essayez-le en ligne!
6 octets
%|@j./
fonctionne si le vecteur est au moins bidimensionnel .la source
%1%:@#.*:
Gelée ,
53 octetsEssayez-le en ligne! ou consultez la suite de tests
Économisé 2 octets grâce aux miles!
la source
÷ÆḊ
Octave , 13 octets
Essayez-le en ligne!
la source
C,
7370 octetsMerci à @Christoph d'avoir enregistré un octet!
Essayez-le en ligne!
la source
s=0,i=0
au lieu d'ens=i=0
enregistrer uns[-i]
mais malheureusement,*--v/=sqrt(s);
c'est 1 octet plus court.s
eti
sont automatiquement initialisés à 0. (Il s'avère que je n'ai pas besoin d'initialiseri
dans la fonction, car la fonction la laisse toujours à la valeur 0)v[-i]
d'obtenir les valeurs dans le bon ordre.Python,
4746 octetsEssayez-le en ligne!
la source
Julia , 9 octets
Essayez-le en ligne!
la source
CJam , 9 octets
Essayez-le en ligne!
Explication
la source
TI-Basic, 6 octets
Exécuter avec
{1,2,3}:prgmNAME
, où{1,2,3}
est le vecteur à normaliser.Divise chaque élément du vecteur par la racine carrée de la somme des carrés de ses éléments.
la source
R , 23 octets
Essayez-le en ligne!
v%*%v
calcule le produit scalaire de v avec lui-même.La fonction émettra un avertissement pour les vecteurs de longueur 2 ou supérieure.
la source
Java (OpenJDK 8) , 57 octets
Essayez-le en ligne!
la source
MATL , 5 octets
Essayez-le en ligne!
Je ne suis pas entièrement sûr que ce soit le moyen le plus court de procéder. Tout d'abord, nous dupliquons l'entrée, puis sélectionnons le deuxième type de sortie de
|
(qui est soitabs
,norm
soitdeterminant
). Enfin, nous divisons l'entrée par la norme.Alternative pour 7 octets:
la source
Haskell , 29 octets
Essayez-le en ligne!
Ou pour 1 octet de plus sans point:
map=<<flip(/).sqrt.sum.map(^2)
la source
Funky , 42 octets
Essayez-le en ligne!
la source
Ohm v2 , 5 octets
Essayez-le en ligne!
la source
C ++ (gcc), 70 octets
Entrée par
std::valarray<float>
. Remplace le vecteur d'origine.Essayez-le en ligne!
la source
#import
fonctionne également avec GCC, Clang et MinGW. Mais, oui, ce n'est pas du C ++ standard.Lisp commun, 69 octets
Essayez-le en ligne!
la source
APL (Dyalog) ,
131210 octets1 octet enregistré grâce à @ Adám
2 octets enregistrés grâce à @ngn
Essayez-le en ligne!
Comment?
la source
⊢÷.5*⍨(+/×⍨)
∘
si elle n'est pas dérivée). Autre que cela, il suffit d'échanger⍺
et⍵
pour⊣
et⊢
:{⍵÷.5*⍨+/×⍨⍵}
→{⍵÷.5*⍨(+/(×⍨⍵))}
→⊢÷.5*⍨(+/(×⍨⊢))
→⊢÷.5*⍨(+/(×⍨))
→⊢÷.5*⍨(+/×⍨)
(+/×⍨)
->+.×⍨
Husk ,
87 octetsEssayez-le en ligne!
la source
C # (.NET Core) , 51 + 64 = 115 octets
Essayez-le en ligne!
+64 octets pour le
using System;using System.Collections.Generic;using System.Linq;
C # (.NET Core) , 94 + 13 = 107 octets
Essayez-le en ligne!
+13 octets pour
using System;
L'approche non Linq
DeGolfed
la source
Perl 5 , 45 + 1 (
-a
) = 46 octetsEssayez-le en ligne!
la source
Pip , 10 octets
9 octets de code, +1 pour l'
-p
indicateur.Prend le vecteur comme arguments de ligne de commande séparés. Essayez-le en ligne!
Comment ça marche
la source
Pyth, 5 octets
Essayez-le en ligne: Test Suite
Explication:
la source
Perl 6 , 25 octets
Essayez-le en ligne!
$_
, l'argument de liste de la fonction, est divisé élément»/»
par élément ( ) par la racine carrée de la somme des carrés des éléments (»²
).la source
Rubis,
3935 octets-4 octets grâce à G B.
la source
sum{...}
au lieu demap{...}.sum
APL NARS 12 caractères
la source
f←
dans votre nombre d'octets, car vous pouvez utiliser les dfns sans lui. Soit dit en passant, est-ce√
qu'un seul octet dans NARS? Je ne le connais pas, alors demandez simplementGoogle Sheets, 65 octets
La liste des entrées est en colonne
A
avec une entrée par cellule. C'est ainsi que les feuilles de calcul utiliseraient normalement des listes. Malheureusement, cela aboutirait normalement à une longue liste,0,0,0,0,0,....
à la fin, nous devons donc ignorer ceux qui ont laIf Blank then Blank else Math
logique.Si tout était dans une seule cellule, la solution serait de 95 octets:
la source
Swift 4, 44 octets
Recalcule la norme vectorielle pour chaque composant, mais au moins c'est laconique!
la source