Вот еще один простой:
Соревнование
Учитывая две точки в n-мерном пространстве, выведите расстояние между ними, также называемое евклидовым расстоянием.
- Координаты будут рациональными числами; единственными ограничениями являются ограничения вашего языка.
- Наименьшее измерение равно 1, самое высокое - это то, с чем может справиться ваш язык
- Вы можете предположить, что две точки имеют одинаковое измерение и что не будет пустых входных данных.
- Расстояние должно быть не менее 3 знаков после запятой. Если ваш язык не поддерживает числа с плавающей запятой, выведите ближайшее целое число.
правила
- Как обычно, функция или полная программа разрешены.
- Ввод может быть взят из STDIN, аргументов командной строки или функции.
- Формат ввода зависит от вас, укажите, какой из них вы использовали в своем ответе.
- Вывод может быть предоставлен печатью в стандартный вывод или возвращаемое значение.
- Это код-гольф, поэтому выигрывает меньшее количество байтов! В случае ничьей победит более ранний ответ.
Контрольные примеры
Каждая точка представлена списком длины n.
[1], [3] -> 2
[1,1], [1,1] -> 0
[1,2], [3,4] -> 2.82842712475
[1,2,3,4], [5,6,7,8] -> 8
[1.5,2,-5], [-3.45,-13,145] -> 150.829382085
[13.37,2,6,-7], [1.2,3.4,-5.6,7.89] -> 22.5020221314
Удачного кодирования!
code-golf
number
arithmetic
geometry
Denker
источник
источник
Ответы:
MATL , 2 байта
Попробуйте онлайн !
ZP
Функция (соответствующая MATLAB - хpdist2
) вычисляет все расстояния попарно между двумя наборами точек, используя евклидово расстояния по умолчанию. Каждый набор точек является матрицей, а каждая точка - строкой. В этом случае он дает один результат - расстояние между двумя точками.источник
MATL,
3 байта4.0Спасибо за -1 от @AndrasDeak!
Читает два вектора (через неявный ввод, который запрашивается
-
), затем вычитает их и вычисляет норму их разности сZn
.Попробуйте онлайн!
источник
Pyth, 2 байта
Буквально функция, которая делает эту проблему
Попробуй это здесь.
источник
Желе , 4 байта
Попробуйте онлайн!
Как это работает
источник
Mathematica, 11 байт
Ввод в виде двух списков, вывод в виде числа. Если входные данные точные (целые числа, рациональные числа и т. Д.), То выходные данные также будут точными. Если на входе содержится число с плавающей запятой, на выходе также будет число с плавающей запятой.
источник
EuclideanDistance
будет работать тоже хорошо ... если бы имя не было так чертовски долго! Если бы только были "MATL для Mathematica", это был бы один байт =)Октава, 15 байт
Пример:
источник
CJam,
118 байтовСпасибо Деннису за сохранение 3 байта.
Запустите все тестовые случаи.
объяснение
Посмотрите этот совет, почему
:mh
работает.источник
:mh
очень хорошHaskell, 46 байтов
Haskell, 35 байт (автор @nimi)
Haskell, 31 байт
<Хак>
</ Хак>
Примеры:
источник
map
+uncurry
+zip
Редко окупается, использованиеzipWith
:d a=sqrt.sum.zipWith(((^2).).(-))a
.(.)
всегда возвращает функцию, которая принимает только один аргумент ... Я думаю, вы можете сделать что-то вроде (.). (.), Но это не стоит того.APL,
1411 байтЭто поезд с диадической функцией, который берет векторы слева и справа и возвращает евклидову норму их разности.
Объяснение:
Попробуй здесь
Сохранено 3 байта благодаря Денису!
источник
.5*⍨(+/-×-)
сохраняет несколько байтов.J, 9 байт
Это функция, которая берет один набор координат из другого (
-/>
), а затем выполняет сумму+
под&.
квадратом*:
.Входные данные должны быть в формате
x y z;a b c
гдеx y z
ваш первый набор координат, аa b c
другой.источник
>
и указать, что входные данные должны быть заданы какx y z,:a b c
.Java,
130117114107105 байтЭто очевидное решение. Я обычно не играю в гольф на Java, но мне было любопытно посмотреть, сможет ли Java превзойти версию Brainfuck. Не похоже, что я хорошо поработал тогда ... Может быть, кто-то мог бы использовать новую Map / Reduce из Java 8, чтобы сохранить несколько байтов.
Благодаря @flawr (13 байтов), @KevinCruijssen (9 байтов) и @DarrelHoffman (3 байта)!
Golfed:
Ungolfed:
источник
for
Петля быть сжата доdouble x=0,s;for(int i=0;++i<a.length;s=a[i]-b[i],x+=s*s);
double[]a,b->{double x=0,s;for(int i=0;++i<a.length;s=a[i]-b[i],x+=s*s);return Math.sqrt(x);}
всего 93 байта.public
перед методом, чтобы сохранить 7 байтов, и вы можете также поместитьx+=s*s
внешнюю часть цикла for, чтобы вам не нужна запятая (т.е.for(int i=-1;++i<a.length;s=a[i]-b[i])x+=s*s;
) для -1 байта.for(int i=0;i<a.length;x+=s*s)s=a[i]-b[i++];
(и я изменил-1
в0
течение дополнительного байта)0
с использованием правил приоритета оператора! Спасибо, что спасли мне много байтов.Юлия, 16 байт
Это функция, которая принимает два массива и возвращает евклидову норму их разности в виде числа с плавающей запятой.
Вы можете проверить все тестовые случаи одновременно онлайн здесь .
источник
Golflua , 43 символа
Работает, называя это как
Эквивалент Lua будет
источник
Серьезно, 12 байт
Попробуйте онлайн!
Объяснение:
источник
Руби, 52
В тестовой программе
источник
AppleScript,
241239 байтЭто гольф-код, но я добавил комментарии в форме
--
.Здесь используется тот же алгоритм, что и для большинства других программ.
источник
Perl 6,
30292624 байта(Спасибо @ b2gills за потерянные еще 2 байта)
использование
источник
{sqrt [+] ([Z-] $_)»²}
JavaScript
ES7, 45ES6, 37 байтОжидается массив пар координат, по одной от каждого вектора, например
[[1, 5], [2, 6], [3, 7], [4, 8]]
. Если это неприемлемо, то для 42 байтов:Ожидаются два массива равной длины, соответствующие двум N-мерным векторам, например
[1, 2, 3, 4], [5, 6, 7, 8]
. Редактировать: 3 байта сохранены благодаря @ l4m2. (Кроме того, никто не заметил мою опечатку?)источник
a=>b=>Math.hypot(...a.map((t,i)=>t-b[i]))
Python 2, 47 байт
Прямое решение. Функция ожидает 2 точки в виде последовательностей чисел и возвращает расстояние между ними.
Пример:
источник
𝔼𝕊𝕄𝕚𝕟, 6 символов / 13 байтов
Try it here (Firefox only).
Вычисляет норму разности входных массивов.
источник
Scala,
6762 байтаТребуется ввод как
последовательность / векторкортежей var-argПример:
источник
C #, 72 байта
Простое решение с использованием Linq.
источник
Шалфей, 35 байт
Эта функция принимает 2 списка в качестве входных данных и возвращает символическое выражение. Расстояние вычисляется путем вычитания вектора в списках и вычисления евклидовой нормы результирующего вектора.
Попробуйте онлайн
источник
TI-Basic (TI-84 Plus CE), 15 байтов
TI-Basic - это токенизированный язык .
Запрашивает ввод в виде двух списков и возвращает евклидово расстояние между ними в
Ans
Объяснение:
источник
R, 4 байта
Это встроенная функция для расчета матрицы расстояний любой входной матрицы. По умолчанию евклидово расстояние.
Пример использования:
Если вы разочарованы, потому что это встроенная версия , то вот не встроенная (или, по крайней мере, менее встроенная ...) версия на 22 байта (благодаря Джузеппе ):
Это анонимная функция, которая принимает два вектора в качестве входных данных.
источник
function(x,y)norm(x-y,"F")
короче, чем ваша вторая версия.Haskell, 32 байта
источник
map
и скобки).sqrt$sum$(^2)<$>zipWith(-)
это недопустимая анонимная функция. Основное правило на самом деле довольно простое: если вы можете написатьf = <mycode>
иf
впоследствии выполнить требуемую задачу, то<mycode>
это допустимая анонимная функция. В вашем случае вам нужно добавитьf p q = <mycode> p q
, поэтому сам<mycode>
по себе не действует.Python 3, 70 символов
Перебирает, находя квадрат разницы и затем корень суммы:
источник
sum([(x-y)**2 for x,y in zip(a,b)])**.5
Mathcad, байты
Использует встроенный оператор векторной величины (абсолютное значение), чтобы вычислить размер разницы между двумя точками (выражается в виде векторов).
Размер Mathcad Golf отложен до тех пор, пока я (или кто-то другой не получу) округлить, чтобы начать обсуждение мета. Однако самый короткий путь (при условии, что ввод точечных векторов не влияет на счет) составляет 3 «байта», с 14 байтами для функциональной версии.
источник
Пайк, 7 байт
Попробуй это здесь!
Транспонировать, применять вычитание, карта квадрата, сумма, sqrt.
источник
Рубин, 50 байтов
Zip, затем отобразите / уменьшите. Едва затягивает другой ответ Ruby от @LevelRiverSt на 2 байта ...
Попробуйте онлайн
источник