Um einen Vektor zu normalisieren , skalieren Sie ihn auf eine Länge von 1 ( ein Einheitsvektor ), während Sie die Richtung konsistent halten.
Zum Beispiel, wenn wir einen Vektor mit drei Komponenten, normalisieren wollten u , würden wir zuerst finden seine Länge:
| u | = sqrt (u x 2 + u y 2 + u z 2 )
... und skalieren Sie dann jede Komponente um diesen Wert, um einen Vektor der Länge 1 zu erhalten.
û = u ÷ | u |
Die Herausforderung
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die bei einer nicht leeren Liste von vorzeichenbehafteten ganzen Zahlen diese als Vektor interpretiert und normalisiert. Dies sollte beispielsweise für eine beliebige Anzahl von Dimensionen funktionieren (Testfälle auf zwei Dezimalstellen gerundet):
[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]
Regeln:
- Sie können davon ausgehen, dass die Eingabeliste:
- Haben Sie mindestens ein Element ungleich Null
- Enthalten Sie nur Zahlen innerhalb des Standard-Gleitkommabereichs Ihrer Sprache
- Ihre Ausgabe sollte auf mindestens zwei Dezimalstellen genau sein . Die Rückgabe von Brüchen / Symbolwerten mit "unendlicher Genauigkeit" ist ebenfalls zulässig, wenn Ihre Sprache die Daten auf diese Weise intern speichert.
- Einreichungen sollten entweder ein vollständiges Programm sein, das E / A ausführt, oder eine Funktion. Übergebene Funktionen können entweder eine neue Liste zurückgeben oder die vorhandene Liste ändern.
- Eingebaute Vektorfunktionen / -klassen sind erlaubt. Wenn Ihre Sprache einen Vektortyp hat, der eine beliebige Anzahl von Dimensionen unterstützt, können Sie eine davon als Eingabe verwenden.
Da dies ein Code-Golf- Wettbewerb ist, sollten Sie versuchen, die kürzestmögliche Lösung (in Byte) zu erzielen.
quelle
Antworten:
05AB1E, 4 bytes
Code:
Try it online!
Explanation
quelle
JavaScript (ES6), 31 bytes
Test cases
Show code snippet
quelle
Mathematica, 9 bytes
Try it online!
quelle
#/Norm@#&
for the same byte count.J, 8 bytes
Try it online!
6 bytes
%|@j./
works if the vector is at least 2-dimensional.quelle
%1%:@#.*:
Jelly,
53 bytesTry it online!, or see the test suite
Saved 2 bytes thanks to miles!
quelle
÷ÆḊ
Octave, 13 bytes
Try it online!
quelle
C,
7370 bytesThanks to @Christoph for saving a byte!
Try it online!
quelle
s=0,i=0
instead ofs=i=0
saves ones[-i]
but sadly*--v/=sqrt(s);
is 1 byte shorter.s
andi
are automatically initialized to 0. (Turns out I don't need to initializei
in the function, because the function always leaves it at value 0)v[-i]
to get the values in correct order.Python,
4746 bytesTry it online!
quelle
Julia, 9 bytes
Try it online!
quelle
CJam, 9 bytes
Try it online!
Explanation
quelle
TI-Basic, 6 bytes
Run with
{1,2,3}:prgmNAME
, where{1,2,3}
is the vector to be normalized.Divides each element in the vector by the square root of the sum of the squares of its elements.
quelle
R, 23 bytes
Try it online!
v%*%v
computes the dot product of v with itself.The function will issue a warning for length 2 or greater vectors.
quelle
Java (OpenJDK 8), 57 bytes
Try it online!
quelle
MATL, 5 bytes
Try it online!
I'm not entirely sure this is the shortest way to do this. First, we duplicate the input, then select the second output type of
|
(which is eitherabs
,norm
ordeterminant
). Finally, we divide the input by the norm.Alternative for 7 bytes:
quelle
Haskell, 29 bytes
Try it online!
Or for 1 byte more pointfree:
map=<<flip(/).sqrt.sum.map(^2)
quelle
Funky, 42 bytes
Try it online!
quelle
Ohm v2, 5 bytes
Try it online!
quelle
C++ (gcc), 70 bytes
Input by
std::valarray<float>
. Overwrites the original vector.Try it online!
quelle
#import
works at least with GCC, Clang and MinGW, too. But, yeah, it's not standard C++.Common Lisp, 69 bytes
Try it online!
quelle
APL (Dyalog),
131210 bytes1 byte saved thanks to @Adám
2 bytes saved thanks to @ngn
Try it online!
How?
quelle
⊢÷.5*⍨(+/×⍨)
∘
if it isn't derived). Other than that, just swap⍺
and⍵
for⊣
and⊢
:{⍵÷.5*⍨+/×⍨⍵}
→{⍵÷.5*⍨(+/(×⍨⍵))}
→⊢÷.5*⍨(+/(×⍨⊢))
→⊢÷.5*⍨(+/(×⍨))
→⊢÷.5*⍨(+/×⍨)
(+/×⍨)
->+.×⍨
Husk,
87 bytesTry it online!
quelle
C# (.NET Core), 51+64=115 bytes
Try it online!
+64 bytes for the
using System;using System.Collections.Generic;using System.Linq;
C# (.NET Core), 94+13=107 bytes
Try it online!
+13 bytes for
using System;
The non-Linq approach
DeGolfed
quelle
Perl 5, 45 + 1 (
-a
) = 46 bytesTry it online!
quelle
Pip, 10 bytes
9 bytes of code, +1 for
-p
flag.Takes the vector as separate command-line arguments. Try it online!
How it works
quelle
Pyth, 5 bytes
Try it online: Test Suite
Explanation:
quelle
Perl 6, 25 bytes
Try it online!
$_
, the list argument to the function, is divided elementwise (»/»
) by the square root of the sum of the squares of the elements (»²
).quelle
Ruby,
3935 bytes-4 bytes thanks to G B.
quelle
sum{...}
instead ofmap{...}.sum
APL NARS 12 Characters
quelle
f←
in your byte count, since you can use the dfns without it. By the way, is√
a single byte in NARS? I'm not familiar with it, so just askingGoogle Sheets, 65 bytes
The input list is in column
A
with one entry per cell. This is how spreadsheets would normally use lists. Unfortunately, this would normally result in a long list of,0,0,0,0,0,....
at the end so we have to ignore those with theIf Blank then Blank else Math
logic.If it was all in one cell, instead, the solution would be 95 bytes:
quelle
Swift 4, 44 bytes
Recalculates the vector norm for every component, but at least it's terse!
quelle