Чтобы нормализовать вектор, нужно масштабировать его до длины 1 ( единичный вектор ), сохраняя при этом постоянное направление.
Например, если мы хотим , чтобы нормализовать вектор с 3 -х компонентов, U , мы бы сначала найти его длину:
| у | = sqrt (u x 2 + u y 2 + u z 2 )
... и затем масштабируйте каждый компонент на это значение, чтобы получить вектор длины 1.
û = u ÷ | u |
Соревнование
Ваша задача - написать программу или функцию, которая, учитывая непустой список целых чисел со знаком, интерпретирует их как вектор и нормализует их. Это должно работать для любого числа измерений, например (контрольные примеры, округленные до двух десятичных разрядов):
[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]
Правила:
- Вы можете предположить, что список ввода будет:
- Иметь хотя бы один ненулевой элемент
- Содержать только числа в пределах стандартного диапазона с плавающей запятой вашего языка
- Ваш вывод должен быть с точностью не менее двух знаков после запятой . Возврат фракций / символьных значений «бесконечной точности» также разрешен, если ваш язык хранит данные внутри себя.
- Представления должны быть либо полной программой, которая выполняет ввод / вывод, либо функцией. Представления функций могут либо вернуть новый список, либо изменить данный список на месте.
- Встроенные векторные функции / классы разрешены. Кроме того, если ваш язык имеет векторный тип, который поддерживает произвольное количество измерений, вы можете использовать одно из них в качестве входных данных.
Это соревнование по коду-гольфу , поэтому вы должны стремиться к достижению как можно более короткого решения (в байтах).
источник
Ответы:
05AB1E , 4 байта
Код:
Попробуйте онлайн!
объяснение
источник
JavaScript (ES6), 31 байт
Контрольные примеры
Показать фрагмент кода
источник
Mathematica, 9 байт
Попробуйте онлайн!
источник
#/Norm@#&
для того же количества байтов.J , 8 байт
Попробуйте онлайн!
6 байт
%|@j./
работает, если вектор хотя бы 2-мерен .источник
%1%:@#.*:
Желе ,
53 байтаПопробуйте онлайн! или посмотрите набор тестов
Сохранено 2 байта благодаря милям!
источник
÷ÆḊ
Октава , 13 байт
Попробуйте онлайн!
источник
C
7370 байтСпасибо @Christoph за сохранение байта!
Попробуйте онлайн!
источник
s=0,i=0
вместо одногоs=i=0
спасаетs[-i]
но, к сожалению,*--v/=sqrt(s);
на 1 байт короче.s
иi
автоматически инициализируются в 0. (Оказывается, мне не нужно инициализироватьi
в функции, потому что функция всегда оставляет ее в значении 0)v[-i]
было получить значения в правильном порядке.Python,
4746 байтПопробуйте онлайн!
источник
Юлия , 9 байт
Попробуйте онлайн!
источник
CJam , 9 байт
Попробуйте онлайн!
объяснение
источник
TI-Basic, 6 байтов
Запустите с
{1,2,3}:prgmNAME
, где{1,2,3}
вектор, который будет нормализован.Делит каждый элемент в векторе на квадратный корень из суммы квадратов его элементов.
источник
R , 23 байта
Попробуйте онлайн!
v%*%v
вычисляет скалярное произведение v с самим собой.Функция выдаст предупреждение для векторов длиной 2 или более.
источник
Java (OpenJDK 8) , 57 байт
Попробуйте онлайн!
источник
MATL , 5 байтов
Попробуйте онлайн!
Я не совсем уверен, что это самый короткий способ сделать это. Сначала мы дублируем ввод, затем выбираем второй тип вывода
|
(который либоabs
,norm
либоdeterminant
). Наконец, мы делим входные данные на норму.Альтернатива для 7 байтов:
источник
Haskell , 29 байт
Попробуйте онлайн!
Или на 1 байт больше поинтов:
map=<<flip(/).sqrt.sum.map(^2)
источник
Фанки , 42 байта
Попробуйте онлайн!
источник
Ом v2 , 5 байт
Попробуйте онлайн!
источник
C ++ (gcc), 70 байт
Вход по
std::valarray<float>
. Перезаписывает оригинальный вектор.Попробуйте онлайн!
источник
#import
работает как минимум с GCC, Clang и MinGW. Но да, это не стандартный C ++.Common Lisp, 69 байт
Попробуйте онлайн!
источник
APL (Dyalog) ,
131210 байтов1 байт сохранен благодаря @ Adám
2 байта сохранены благодаря @ngn
Попробуйте онлайн!
Как?
источник
⊢÷.5*⍨(+/×⍨)
∘
если она не является производной). Кроме этого, просто поменяйте местами⍺
и⍵
на⊣
и⊢
:{⍵÷.5*⍨+/×⍨⍵}
→{⍵÷.5*⍨(+/(×⍨⍵))}
→⊢÷.5*⍨(+/(×⍨⊢))
→⊢÷.5*⍨(+/(×⍨))
→⊢÷.5*⍨(+/×⍨)
(+/×⍨)
->+.×⍨
Шелуха ,
8байтПопробуйте онлайн!
источник
C # (.NET Core) , 51 + 64 = 115 байт
Попробуйте онлайн!
+64 байта для
using System;using System.Collections.Generic;using System.Linq;
C # (.NET Core) , 94 + 13 = 107 байт
Попробуйте онлайн!
+13 байт для
using System;
Не Линк подход
DeGolfed
источник
Perl 5 , 45 + 1 (
-a
) = 46 байтПопробуйте онлайн!
источник
Пип , 10 байт
9 байтов кода, +1 для
-p
флага.Принимает вектор как отдельные аргументы командной строки. Попробуйте онлайн!
Как это работает
источник
Pyth, 5 байт
Попробуйте онлайн: Test Suite
Объяснение:
источник
Perl 6 , 25 байт
Попробуйте онлайн!
$_
аргумент списка функции, делится»/»
по элементам (»²
) на квадратный корень из суммы квадратов элементов ( ).источник
Рубин,
3935 байт-4 байта благодаря G B.
источник
sum{...}
вместоmap{...}.sum
APL NARS 12 персонажей
источник
f←
байтов, так как вы можете использовать dfns без него. Кстати,√
это один байт в NARS? Я не знаком с этим, поэтому просто спрашиваюGoogle Sheets, 65 байт
Список ввода находится в столбце
A
с одной записью на ячейку. Так электронные таблицы обычно используют списки. К сожалению, это обычно приводит к длинному списку,0,0,0,0,0,....
в конце, поэтому мы должны игнорировать тех, кто сIf Blank then Blank else Math
логикой.Если бы все было в одной ячейке, вместо этого было бы 95 байтов:
источник
Swift 4, 44 байта
Пересчитывает векторную норму для каждого компонента, но, по крайней мере, это кратко!
источник