Представьте себе, что вы путешествуете в точку, лежащую на расстоянии A миль по горизонтали и B миль по вертикали от вашего текущего положения. Или, другими словами, путешествуя от (0, 0)
точки к точке (a, b)
. Как далеко вы должны были бы в конечном итоге путешествовать? Это кажется простым вопросом, но ответ зависит от того, кого вы спрашиваете. Если вы вороной, и вы можете путешествовать по прямой , расстояние , пройденное это просто евклидово расстояние до (a, b)
. Это
sqrt(a^2 + b^2)
Но если вы просто скучный человек, вам не нужно идти так далеко, поэтому вам нужно взять такси. Большинство такси не едут по прямой линии к месту назначения, потому что они обычно пытаются остаться на дорогах. Таким образом, реальное расстояние, которое вы в конечном итоге пройдете, является суммой вертикального расстояния и горизонтального расстояния. Или формула:
abs(a) + abs(b)
Это называется расстояние такси . Эта картина хорошо демонстрирует разницу между ними:
Чтобы добраться до (6, 6)
, ворона может просто лететь по зеленой линии, и это дает расстояние 6 * sqrt(2)
или примерно 8,49. Такси может пройти по красной, синей или желтой дорожке, но все они займут 12.
Это приводит к реальному вопросу, который я задаю. Если ворона и такси уезжают из точки (0, 0)
и едут в точку (a, b)
, то как долго длится путь такси? Или, в более математическом жаргоне,
Учитывая двумерный вектор, определите разность между нормой 2 вектора и нормой 1 вектора.
Вы должны написать максимально короткую программу или функцию, чтобы ответить на этот вопрос. Вы можете выбрать «a» и «b» как два отдельных входа или как кортеж из двух элементов. Вы можете взять ввод и вывод в любом разумном формате. Если разница не является целым числом, вы должны быть с точностью не менее двух десятичных знаков.
Вы всегда можете предположить, что «a» и «b» будут целыми числами, и что они не будут оба равны 0. (Хотя возможно, что любой из них будет нулевым)
Как обычно, применяются стандартные лазейки и стараются сделать вашу программу максимально короткой, посчитанной в байтах.
Я буду приветствовать любой ответ, который публикует объяснение того, как работает код, и демонстрирует любые интересные приемы, используемые для сохранения байтов.
Вот несколько примеров для тестирования вашего кода:
#input #output
3, 4 2
-3, 4 2
-3, -4 2
6, 6 3.51
42, 0 0
10, 10 5.86
3, 3 1.76
Удачи в гольф! :)
10,10
должен быть 5,86, так как он получается,5.85786...
и вы округлили тот, что ниже.Ответы:
Такси ,
73943773 байтаПопробуйте онлайн!
Инженер Тост , гораздо более опытный игрок в Такси, решил потратить некоторое время (возможно, намного меньше, чем я) и заняться гольфом в своей программе «Такси», переписав ее. Вы можете найти мое старое тело ответа и ссылки на мои старые TIO в истории редактирования.
Алгоритм квадратного корня ungolfed инженера Тоста: Попробуйте это онлайн!
Неуправляемый, с объяснениями:
источник
-1 is waiting at Starchild Numerology.
Javascript (ES6), 36 байт
-1 байт благодаря @dtkaias
Пример кода:
источник
**
.(x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y)
.a=>b=>a+b-Math.hypot(a,b)
?(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)
Хорошо , как насчет 36 байтов, ES6-совместимых тожеЮлия, 20 байт
Берет
a
иb
как список.norm
Второй аргумент Джулии по умолчанию равен 2 - следовательно, это будет эквивалентноnorm(x, 1) - norm(x, 2)
.источник
Java 8, 47 байт
Golfed:
Это примерно так просто: вычтите два вычисленных значения, чтобы найти разницу. Это использует троичную логику вместо
Math.abs()
чтобы сохранять один байт в каждом случае. К сожалению, скобки требуются из-за приоритета оператора.Вывод, какой бы ни был Java
double
может содержать , с точностью более двух знаков после запятой и удовлетворяет требованию точности вопроса.Ungolfed:
Выход:
источник
a->b->
.Mathematica, 32 байта
или
Mathematica, 31 байт
или @ Не предложение дерева
Mathematica, 26 байтов
или предложение @ alephalpha
Mathematica, 19 байт
источник
N[Tr@Abs@{##}-Abs[#+I#2]]&
N[#~Norm~1-Norm@#]&
,#~Norm~1-N@Norm@#&
возможно?Dyalog APL, 13 байт
Попробуйте онлайн!
Пояснение (ввод X):
источник
R , 30 байт
Принимает
v
в качестве матрицы из 1 столбца.norm
вычисляет конкретную норму матрицы, по умолчанию используется норма L1 (taxicab) иf
норма L2 ('f'
для фробениусов / евклидов).Попробуйте онлайн!
источник
Python 2 ,
4038 байт-2 байта благодаря vaultah.
Забавный факт, 11 байт этого кода были просто скопированы с вопроса и сыграны в гольф.
Попробуйте онлайн!
источник
abs(a+b*1j)
должно работать вместо(a*a+b*b)**.5
Japt ,
119 байт-2 байта благодаря @ETHproductions
Попробуйте онлайн!
Разъяснения
источник
Mh
подержанный. Я полагаю, что вы можете сократитьUa +Va
доNxa
(сумма входов, работающихa
на каждом)Mh
!»: Большинство методов в Japt могут принимать то, что @ETHproductions называет «авто-функцией» в качестве аргумента. См. Этот совет, чтобы узнать больше о них. И завтра я напишу совет о с использованием авто-функций с уменьшением массива для достижения некоторых интересных результатов (например,rw
возвращает наибольшее целое число в массиве).Схема - 58 байт.
источник
define
и(
и один между)
и(
.Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
(lambda(a b)(...))
должно быть достаточно вместо привязки его к имени. Также(sqrt(* a a b b))
сэкономил бы пару байтов.Pyth, 8 байт
Попробуйте онлайн. Тестирование.
объяснение
источник
APL (Dyalog) , 14 байтов
Принимает аргумент в виде
xJy
, например3J4
Попробуйте онлайн!
|
величина док|
величина аргумента-
минус2+/
попарная сумма∘
из|
величины9 11.○⊢
реальная и мнимая части аргумента.докторСпециальным трюком для игры в гольф было использование парного редукции (
2+/
) для предоставления+/
аргумента без левых операций, что позволяет избежать скобок:||-(+/∘|9 11○⊢)
источник
J, 13 байт
Это функция, которая принимает координаты в виде массива, например:
Объяснение:
источник
&.:
- я не знал:
о Under.05AB1E , 7 байтов
Попробуйте онлайн!
объяснение
источник
TI-Basic (TI-84 Plus CE), 10 байтов
Программа, которая вводит в виде списка из двух целых чисел
Ans
, например, вызов с{3,4}:prgmCROW
(замена3,4
на вход иCROW
на имя программы).Объяснение:
источник
√
и $ Ans ^ 2 $ кодируются. 10 нажатий клавиш , возможно, но это не одно и то же.MATL ,
87 байтПопробуйте онлайн!
объяснение
источник
Common Lisp, 57 байт
Попробуйте онлайн!
источник
GNU APL 1.2, 24 байта
∇f P
объявляет функцию,f
которая принимает вектор,P
содержащий расстояния в качестве аргумента (например[3, 4]
)APL работает с векторами, поэтому
+/|P
применяет|
оператор (abs
функцию) к каждому элементу в векторе, а затем оценивает+
каждый элемент (поэтому добавьте все элементы). Это дает расстояние такси.P*2
дает вектор, который совпадаетP
с квадратом каждого элемента.+/P*2
сложить их вместе и затем (с круглыми скобками для приоритета, потому что APL справа налево),*.5
чтобы получить квадратный корень. Это дает воронье расстояние.Добавьте дополнительную пару скобок для расстояния такси для определения приоритета и вычислите разницу.
∇
чтобы закончить функцию.источник
{(+/|⍵)-(+/⍵*2)*.5}
?J ,
98 байт-1 спасибо моему коллеге маршалу.
Попробуйте онлайн!
Принимает A в качестве левого аргумента и B в качестве правого аргумента.
+
сумма&
из|
величины-
минус|
величина@
изj.
A + B iУловка игры в гольф: объедините значения в одно комплексное число, потому что диагональ легко получить таким образом, и в то же время держите их отдельно, потому что сумму легко получить таким образом.
источник
Добавить ++ ,
5957 байтПопробуйте онлайн!
Это заняло у меня много времени, чтобы решить. Он не округляет окончательный ответ, так как это невозможно в Add ++. Вот как программа работает с входами
-3
и-4
(ACC
является значением аккумулятора)источник
PHP> = 7.1, 54 байта
PHP Sandbox Online
PHP , 55 байт
Попробуйте онлайн!
PHP , 60 байт
с функцией вместо полной программы
Попробуйте онлайн!
источник
Excel VBA, 34 байта
Функция анонимного непосредственного окна VBE, которая берет входные данные из диапазона
[A1:B1]
и выводит разницу между расстояниями Евклида и Таксикаба до непосредственного окна VBE.источник
=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Пари / ГП , 26 байт
Попробуйте онлайн!
источник
Желе , 7 байт
Попробуйте онлайн!
Формат - это список из двух чисел.
источник
,,, 18 байт
По сути это порт моего Python ответа.
источник
Рубин , 31 байт
Создает комплексное число для расчета расстояния с.
Попробуйте онлайн!
источник
Рубин (2.0.0 - 2.3.0), 57 байт
Это предполагает получение информации от ARGV, например
Это похоже на чит, так как Ruby поставляется с математической библиотекой, которая имеет функции abs и sqrt (в отличие от парня, который написал свои собственные функции abs и sqrt, хотя я не видел ничего, специально запрещающего использование таких функций).
Первый трюк использует
.map
вместо того, чтобы.each
сохранить байт, а затем использовать&:symbol
нотацию для передачи карты выполняемый нами процессto_i
для каждого элемента в массиве, и использовать множественное присваивание для присвоения значений x и y.Более длинная версия будет:
(поскольку map возвращает массив, вероятно, это можно сделать с помощью множественного присваивания, но это исключает любые дополнительные параметры, но мы все равно предполагаем только два ввода)
Затем я просто удалил все пробелы в уравнении.
Вот более длинная версия, 84 байта
Цель здесь состояла в том, чтобы не повторяться, например, нужно написать
x
илиabs
дважды, и мой квадрат дваждыx**2 + y**2
Это не работает.
Но интересно то, что для put не требуется пробел, я думаю, что лексер достаточно умен, чтобы видеть специальный символ и знать, что это специальный var.
inject
иreduce
являются синонимами, инъекция имеет подписьВ нашем случае нам нужно установить начальное значение в 0, тогда у нас есть наш аккумулятор (то есть: memo = 0) и объект из каждой итерации.
Недостатком этого метода является то, что он будет принимать более двух входных данных и будет суммировать или возводить в квадрат, добавлять, а затем выводить все значения в массиве.
Я думаю - хотя у меня нет Ruby 2.4.0 для тестирования - что это также будет работать, что составляет 72 байта:
Сумма по умолчанию равна 0 и, насколько я могу судить, работает так же, как инъекция / уменьшение.
источник
Google Sheets, 31 байт
Функция рабочего листа, которая берет данные из диапазона
[A1:B1]
и выводит разницу между расстояниями Евклида и ТаксикабаExcel, 32 байта
То же, что и выше, но отформатировано для MS Excel
источник
Pyth , 7 байт
Попробуй здесь
Pyth ,
2523 байтаЭто первоначальное решение, мое первое не очень тривиальное решение Pyth, и вы можете видеть, как плохо я играл в гольф в Pyth :)
Попробуйте онлайн!
источник
Пип , 15 байт
Принимает данные из аргументов командной строки. Попробуйте онлайн!
объяснение
В псевдокоде это так
abs(a) + abs(b) - sqrt(fold+(g*g))
.a
иb
являются первыми двумя аргументами cmdline, иg
является списком аргументов cmdline (то есть argv).*
Оператор векторизация, как и многие операторы Пипа, так$+g*g
это то же самое,a*a + b*b
. Остальное довольно просто.К сожалению, я не могу сохранить ни одного байта с помощью
$+ABg
, потому что приоритет операторов с помощью fold не работает так, как должен.$+
должно быть чуть более высокий приоритет, чем двоичный-
, но в данный момент он анализируется как$+(ABg-RT$+g*g)
, давая неправильный ответ. Выполнение($+ABg)-RT$+g*g
не сохраняет никаких байтов по сравнению с менее запутанной версией выше.источник