Aby znormalizować wektor, należy przeskalować go do długości 1 ( wektor jednostkowy ), zachowując spójność kierunku.
Na przykład, jeśli chcielibyśmy znormalizować wektor składający się z 3 składników, u najpierw ustalilibyśmy jego długość:
| u | = sqrt (u x 2 + u y 2 + u z 2 )
... a następnie przeskaluj każdy składnik według tej wartości, aby uzyskać wektor długości 1.
û = u ÷ | u |
Wyzwanie
Twoim zadaniem jest napisanie programu lub funkcji, która biorąc pod uwagę niepustą listę liczb całkowitych, interpretuje ją jako wektor i normalizuje. Powinno to działać dla dowolnej liczby wymiarów, na przykład (przypadki testowe zaokrąglone do dwóch miejsc po przecinku):
[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]
Zasady:
- Możesz założyć, że lista wejściowa:
- Mieć co najmniej jeden niezerowy element
- Zawiera tylko liczby ze standardowego zakresu zmiennoprzecinkowego w Twoim języku
- Wynik powinien być dokładny do co najmniej dwóch miejsc po przecinku . Dopuszczalne jest również zwracanie ułamków / wartości symbolicznych „nieskończonej precyzji”, jeśli w ten sposób dane są przechowywane wewnętrznie przez Twój język.
- Zgłoszenia powinny być albo pełnym programem wykonującym operacje we / wy, albo funkcją. Przesłanie funkcji może albo zwrócić nową listę, albo zmodyfikować podaną listę.
- Wbudowane funkcje / klasy wektorowe są dozwolone. Dodatkowo, jeśli twój język ma typ wektorowy, który obsługuje dowolną liczbę wymiarów, możesz wziąć jeden z nich jako dane wejściowe.
Jest to konkurs golfowy , więc powinieneś dążyć do jak najkrótszego możliwego rozwiązania (w bajtach).
źródło
Odpowiedzi:
05AB1E , 4 bajty
Kod:
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES6), 31 bajtów
Przypadki testowe
Pokaż fragment kodu
źródło
Mathematica, 9 bajtów
Wypróbuj online!
źródło
#/Norm@#&
dla tej samej liczby bajtów.J , 8 bajtów
Wypróbuj online!
6 bajtów
%|@j./
działa, jeśli wektor jest co najmniej dwuwymiarowy .źródło
%1%:@#.*:
Galaretka ,
53 bajtówWypróbuj online! lub zobacz pakiet testowy
Zaoszczędzone 2 bajty dzięki kilometrom!
źródło
÷ÆḊ
Oktawa , 13 bajtów
Wypróbuj online!
źródło
C,
7370 bajtówDzięki @Christoph za uratowanie bajtu!
Wypróbuj online!
źródło
s=0,i=0
zamiasts=i=0
ratuje jedens[-i]
ale niestety*--v/=sqrt(s);
jest o 1 bajt krótszy.s
ii
są automatycznie inicjowane na 0. (Okazuje się, że nie muszę inicjowaći
w funkcji, ponieważ funkcja zawsze pozostawia wartość 0)v[-i]
uzyskać wartości we właściwej kolejności.Python,
4746 bajtówWypróbuj online!
źródło
Julia , 9 bajtów
Wypróbuj online!
źródło
CJam , 9 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
TI-Basic, 6 bajtów
Uruchom z
{1,2,3}:prgmNAME
, gdzie{1,2,3}
jest wektor do znormalizowania.Dzieli każdy element w wektorze przez pierwiastek kwadratowy z sumy kwadratów jego elementów.
źródło
R , 23 bajty
Wypróbuj online!
v%*%v
oblicza iloczyn iloczynu v z samym sobą.Ta funkcja wyświetli ostrzeżenie dla wektorów o długości 2 lub większej.
źródło
Java (OpenJDK 8) , 57 bajtów
Wypróbuj online!
źródło
MATL , 5 bajtów
Wypróbuj online!
Nie jestem do końca pewien, czy jest to najkrótszy sposób na zrobienie tego. Najpierw powielamy dane wejściowe, a następnie wybieramy drugi typ danych wyjściowych
|
(którym jest alboabs
,norm
albodeterminant
). Wreszcie dzielimy dane wejściowe przez normę.Alternatywa dla 7 bajtów:
źródło
Haskell , 29 bajtów
Wypróbuj online!
Lub o 1 bajt więcej bez punktów:
map=<<flip(/).sqrt.sum.map(^2)
źródło
Funky , 42 bajty
Wypróbuj online!
źródło
Ohm v2 , 5 bajtów
Wypróbuj online!
źródło
C ++ (gcc), 70 bajtów
Wejście od
std::valarray<float>
. Zastępuje oryginalny wektor.Wypróbuj online!
źródło
#import
współpracuje przynajmniej z GCC, Clang i MinGW. Ale tak, to nie jest standardowy C ++.Common Lisp, 69 bajtów
Wypróbuj online!
źródło
APL (Dyalog) ,
131210 bajtów1 bajt zapisany dzięki @ Adám
2 bajty zapisane dzięki @ngn
Wypróbuj online!
W jaki sposób?
źródło
⊢÷.5*⍨(+/×⍨)
∘
jeśli nie jest wyprowadzony). Poza tym po prostu zamień⍺
i⍵
na⊣
i⊢
:{⍵÷.5*⍨+/×⍨⍵}
→{⍵÷.5*⍨(+/(×⍨⍵))}
→⊢÷.5*⍨(+/(×⍨⊢))
→⊢÷.5*⍨(+/(×⍨))
→⊢÷.5*⍨(+/×⍨)
(+/×⍨)
->+.×⍨
Łuska ,
87 bajtówWypróbuj online!
źródło
C # (.NET Core) , 51 + 64 = 115 bajtów
Wypróbuj online!
+64 bajty dla
using System;using System.Collections.Generic;using System.Linq;
C # (.NET Core) , 94 + 13 = 107 bajtów
Wypróbuj online!
+13 bajtów dla
using System;
Podejście inne niż Linq
DeGolfed
źródło
Perl 5 , 45 + 1 (
-a
) = 46 bajtówWypróbuj online!
źródło
Pip , 10 bajtów
9 bajtów kodu, +1 dla
-p
flagi.Traktuje wektor jako osobne argumenty wiersza polecenia. Wypróbuj online!
Jak to działa
źródło
Pyth, 5 bajtów
Wypróbuj online: pakiet testowy
Wyjaśnienie:
źródło
Perl 6 , 25 bajtów
Wypróbuj online!
$_
, argument listy funkcji jest podzielony elementarnie (»/»
) przez pierwiastek kwadratowy z sumy kwadratów elementów (»²
).źródło
Rubin,
3935 bajtów-4 bajty dzięki G B.
źródło
sum{...}
zamiastmap{...}.sum
APL NARS 12 znaków
źródło
f←
swojej liczby bajtów, ponieważ bez niej możesz używać dfns. Nawiasem mówiąc, czy√
w NARS jest jeden bajt? Nie jestem z tym zaznajomiony, więc po prostu pytamArkusze Google, 65 bajtów
Lista wejściowa jest w kolumnie
A
z jednym wpisem na komórkę. W ten sposób arkusze kalkulacyjne normalnie używają list. Niestety zwykle powoduje to długą listę,0,0,0,0,0,....
na końcu, więc musimy zignorowaćIf Blank then Blank else Math
logikę.Gdyby wszystko było w jednej komórce, rozwiązaniem byłoby 95 bajtów:
źródło
Szybkie 4, 44 bajty
Ponownie oblicza normę wektorową dla każdego komponentu, ale przynajmniej jest to zwięzłe!
źródło