Ворон против Таксика


36

Представьте себе, что вы путешествуете в точку, лежащую на расстоянии 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

Удачи в гольф! :)


9
мы можем принять ввод как комплексное число?
Уриэль

Я думаю, что тестовый случай для 10,10должен быть 5,86, так как он получается, 5.85786...и вы округлили тот, что ниже.
Числовой маньяк

4
Сначала я прочитал название «Корова против Таксикаба» и надеялся найти что-то, связанное с физикой столкновений ...
MooseBoys

Можем ли мы дать отрицательные результаты?
Адам

@ Adám Нет. (С концептуальной точки зрения ты возвращаешь расстояние, которое всегда положительно)
DJMcMayhem

Ответы:


107

Такси , 7394 3773 байта

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Tom's Trims.Pickup a passenger going to Tom's Trims.Go to Tom's Trims:n.[a]Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 1 l 2 r.Pickup a passenger going to Addition Alley.Pickup a passenger going to Multiplication Station.1 is waiting at Starchild Numerology.Go to Starchild Numerology:s 2 l 2 r.Pickup a passenger going to Cyclone.Go to Cyclone:w 1 r 4 l.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to The Underground.Go to Cyclone:n 1 l 1 l.Pickup a passenger going to Multiplication Station.Go to The Underground:n 2 r 2 r.Switch to plan "b" if no one is waiting.Pickup a passenger going to Charboil Grill.Go to Charboil Grill:s 2 r 1 l 1 l 2 r.-1 is waiting at Starchild Numerology.Go to Starchild Numerology:e 2 r.Pickup a passenger going to Multiplication Station.Go to The Underground:w 1 r 2 r 1 r 2 l.[b]Go to Multiplication Station:s 1 l 1 r.Go to Tom's Trims:s 1 r 3 r.Switch to plan "c" if no one is waiting.Switch to plan "a".[c]Go to Multiplication Station:s 1 l 3 l.Pickup a passenger going to Cyclone.Pickup a passenger going to Cyclone.Go to Cyclone:s 1 r 2 l 2 r.Pickup a passenger going to Addition Alley.Pickup a passenger going to Cyclone.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to Multiplication Station.-1 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:w 1 r 2 r 1 r 4 l.Pickup a passenger going to Rob's Rest.Go to Rob's Rest:s 1 r 2 l 1 l 1 r 1 r.Go to Cyclone:s 1 l 1 l 1 l 1 r.Pickup a passenger going to Cyclone.[d]Pickup a passenger going to Multiplication Station.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:s 1 l 2 r 4 l.Pickup a passenger going to Addition Alley.Go to Cyclone:s 1 r 2 l 2 r.Switch to plan "e" if no one is waiting.Switch to plan "d".[e]Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to Cyclone.99 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.Pickup a passenger going to The Underground.Go to Cyclone:e 1 l 2 r.Pickup a passenger going to Trunkers.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 1 r.Go to Trunkers:s 1 l.[f]Pickup a passenger going to Cyclone.Go to Cyclone:w 2 r.Pickup a passenger going to Divide and Conquer.Pickup a passenger going to Trunkers.Go to Trunkers:s 1 l.Go to Sunny Skies Park:w 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l.Pickup a passenger going to Divide and Conquer.Go to Zoom Zoom:n.Go to Divide and Conquer:w 1 l 2 r 1 r.Pickup a passenger going to Addition Alley.Go to Cyclone:e 1 l 1 l 2 l.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to Divide and Conquer.2 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 1 l 3 l 2 r.Pickup a passenger going to Divide and Conquer.Go to Divide and Conquer:w 1 r 2 r 1 r 2 l 3 l.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:e 1 l 1 l 2 l 1 l.Go to The Underground:s 1 l 1 r 2 l.Switch to plan "g" if no one is waiting.Pickup a passenger going to The Underground.Go to Trunkers:s 2 r 1 l.Switch to plan "f".[g]Go to Rob's Rest:n 3 l 2 l 1 l 2 r 1 r.Pickup a passenger going to What's The Difference.Go to Sunny Skies Park:s 1 l 1 l.Pickup a passenger going to What's The Difference.Go to What's The Difference:n 1 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:e 3 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

Попробуйте онлайн!

Инженер Тост , гораздо более опытный игрок в Такси, решил потратить некоторое время (возможно, намного меньше, чем я) и заняться гольфом в своей программе «Такси», переписав ее. Вы можете найти мое старое тело ответа и ссылки на мои старые TIO в истории редактирования.

Алгоритм квадратного корня ungolfed инженера Тоста: Попробуйте это онлайн!

Неуправляемый, с объяснениями:

[ Crow vs. Taxi ]


[ GET THE NEGATIVE ABSOLUTE VALUES OF BOTH STDINS ]

[Move the stdin values to Tom's Trims b/c:]
[1) Stdin doesn't count as a passenger waiting]
[2) Checking for no one waiting is shorter that keeping tracker of a count for just 2 iterations OR repeating all the code over again]
Go to Post Office:w 1 l 1 r 1 l.
Pickup a passenger going to Tom's Trims.
Pickup a passenger going to Tom's Trims.
Go to Tom's Trims:n.

[a]
[Clone the first waiting value]
[If we've already picked up both, move to the next process]
[Switch to plan "c" if no one is waiting.]
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery:s 1 l 1 r.
Pickup a passenger going to Cyclone.
Go to Cyclone:n 1 l 1 l 2 r.
Pickup a passenger going to Addition Alley.
Pickup a passenger going to Multiplication Station.

[Add one to the value]
1 is waiting at Starchild Numerology.
Go to Starchild Numerology:s 2 l 2 r.
Pickup a passenger going to Cyclone.
Go to Cyclone:w 1 r 4 l.
Pickup a passenger going to Addition Alley.
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to The Underground.

[Pick up a clone of that one to feed into Multiplication Station]
Go to Cyclone:n 1 l 1 l.
Pickup a passenger going to Multiplication Station.

[Subtract one and see if that's more than zero]
Go to The Underground:n 2 r 2 r.
Switch to plan "b" if no one is waiting.

[It was more than zero so we make it negative]
[First, though, get rid of the pesky result from The Underground]
Pickup a passenger going to Charboil Grill.
Go to Charboil Grill:s 2 r 1 l 1 l 2 r.
-1 is waiting at Starchild Numerology.
Go to Starchild Numerology:e 2 r.
Pickup a passenger going to Multiplication Station.
Go to The Underground:w 1 r 2 r 1 r 2 l.

[b]
[Make sure it's a negative value and leave it at Multiplication Station]
[Either it was already negative OR we now have -1 as a passenger]
Go to Multiplication Station:s 1 l 1 r.

[Get the next stdin unless we've already gotten them both]
Go to Tom's Trims:s 1 r 3 r.
Switch to plan "c" if no one is waiting.
Switch to plan "a".


[ ADD THE TWO NEGATIVES AND INVERT TO GET THE TAXI DISTANCE]

[c]
[Pickup the two negative absolute values and clone them]
Go to Multiplication Station:s 1 l 3 l.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Cyclone.
Go to Cyclone:s 1 r 2 l 2 r.
Pickup a passenger going to Addition Alley.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Addition Alley.

[Add the two clones values to get the negative Taxi distance]
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to Multiplication Station.

[Invert to get the Taxi distance and store it at Rob's Rest]
-1 is waiting at Starchild Numerology.
Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station:w 1 r 2 r 1 r 4 l.
Pickup a passenger going to Rob's Rest.
Go to Rob's Rest:s 1 r 2 l 1 l 1 r 1 r.


[ FIND THE CROW DISTANCE ]
[Uses the Babylonian method: https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method ]

[Square and Sum the cloned values]
Go to Cyclone:s 1 l 1 l 1 l 1 r.
Pickup a passenger going to Cyclone.
[d]
Pickup a passenger going to Multiplication Station.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station:s 1 l 2 r 4 l.
Pickup a passenger going to Addition Alley.
Go to Cyclone:s 1 r 2 l 2 r.
Switch to plan "e" if no one is waiting.
Switch to plan "d".
[e]
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to Cyclone.

[Pickup our cycle counter]
[It's cheaper to do this than to check each iteration's value as equal to the last]
[Taxi can only handle integers up to 2^31-1 so 99 iterations is sufficient.]
99 is waiting at Starchild Numerology.
Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.
Pickup a passenger going to The Underground.

[Duplicate stdin to be stored as S at Trunkers and as x0 at Sunny Skies Park]
[a & b are always integers so Trunkers won't hurt S and it's close with a short name so it's good for golfing]
Go to Cyclone:e 1 l 2 r.
Pickup a passenger going to Trunkers.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park:n 1 r.
Go to Trunkers:s 1 l.

[ This is our starting position for square root:           ]
[  • x at Sunny Skies Park                                 ]
[  • S at Trunkers                                         ]
[  • Taxi at Trunkers                                      ]
[  • The iterator as a passenger going to The Underground  ]

[f]

[Duplicate S so we don't lose it]
Pickup a passenger going to Cyclone.
Go to Cyclone:w 2 r.
Pickup a passenger going to Divide and Conquer.
Pickup a passenger going to Trunkers.
Go to Trunkers:s 1 l.

[Diplicate x for division and addition]
Go to Sunny Skies Park:w 1 r.
Pickup a passenger going to Cyclone.
Go to Cyclone:n 1 l.
Pickup a passenger going to Divide and Conquer.

[Gas will be super important in this loop]
Go to Zoom Zoom:n.

[Perform (x + S/x)/2]
[(/2) turns out to be a few bytes shorter than (*.5), mostly due to place names]
Go to Divide and Conquer:w 1 l 2 r 1 r.
Pickup a passenger going to Addition Alley.
Go to Cyclone:e 1 l 1 l 2 l.
Pickup a passenger going to Addition Alley.
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to Divide and Conquer.
2 is waiting at Starchild Numerology.
Go to Starchild Numerology:n 1 l 1 l 3 l 2 r.
Pickup a passenger going to Divide and Conquer.
Go to Divide and Conquer:w 1 r 2 r 1 r 2 l 3 l.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park:e 1 l 1 l 2 l 1 l.
[Now we have the next iteration of x]

[Check the iterator]
Go to The Underground:s 1 l 1 r 2 l.
Switch to plan "g" if no one is waiting.
Pickup a passenger going to The Underground.

[Reset the loop]
Go to Trunkers:s 2 r 1 l.
Switch to plan "f".


[ ADD THE NEGATIVE SUM TO THE SQUARE ROOT TO GET THE NEGATIVE DIFFERENCE ]

[g]
Go to Rob's Rest:n 3 l 2 l 1 l 2 r 1 r.
Pickup a passenger going to What's The Difference.
Go to Sunny Skies Park:s 1 l 1 l.
Pickup a passenger going to What's The Difference.
Go to What's The Difference:n 1 r 1 l.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery:e 3 r.
Pickup a passenger going to Post Office.
Go to Post Office:n 1 l 1 r.


2
@ Грифон, безумная штука, я на 100% уверен, что смогу удалить две тысячи байт, как только вернусь к своей логике, пока я не сплю
Стивен,

4
4 часа достойны +1 сами по себе!
Лохматый

4
Я уверен, что число игроков в гольф, которые прочитают все объяснение, будет меньше, чем ваши байты: D
Grajdeanu Alex.

1
+1 за-1 is waiting at Starchild Numerology.
Кейу Ган

10

Javascript (ES6), 36 байт

-1 байт благодаря @dtkaias

(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)

Пример кода:

f=

(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)

for(i=0;i<7;i++)
  a=[3,-3,-3,6,42,10,3][i],
  b=[4,4,-4,6,0,10,3][i],
  console.log(`f(${a},${b}) = ${f(a,b)}`)


ES6 не имеет **.
Нил

2
Настоящая версия ES6, вероятно , будет 41 байт: (x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y).
Нил

@DanEsparza Это явно раньше. Вот для чего
Нил

Почему нет a=>b=>a+b-Math.hypot(a,b)?
dtkaias

1
(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)Хорошо , как насчет 36 байтов, ES6-совместимых тоже
dtkaias

8

Юлия, 20 байт

x->norm(x,1)-norm(x)

Берет aи bкак список.

normВторой аргумент Джулии по умолчанию равен 2 - следовательно, это будет эквивалентно norm(x, 1) - norm(x, 2).


Я тоже думал об использовании Юлии!
enedil

Очень похоже на ответ MATLAB, который я собирался опубликовать.
TheIncredibleZ1

6

Java 8, 47 байт

Golfed:

(a,b)->(a<0?-a:a)+(b<0?-b:b)-Math.sqrt(a*a+b*b)

Это примерно так просто: вычтите два вычисленных значения, чтобы найти разницу. Это использует троичную логику вместоMath.abs() чтобы сохранять один байт в каждом случае. К сожалению, скобки требуются из-за приоритета оператора.

Вывод, какой бы ни был Java double может содержать , с точностью более двух знаков после запятой и удовлетворяет требованию точности вопроса.

Ungolfed:

public class TheCrowVsTheTaxicab {

  public static void main(String[] args) {
    int[][] inputs = new int[][] { { 3, 4 }, { -3, 4 }, { -3, -4 }, { 6, 6, }, { 42, 0 }, { 10, 10 }, { 3, 3 } };
    double[] outputs = new double[] { 2, 2, 2, 3.51, 0, 5.85, 1.76 };

    for (int i = 0; i < inputs.length; ++i) {
      double actual =
        f((a, b) -> (a < 0 ? -a : a) + (b < 0 ? -b : b) - Math.sqrt(a * a + b * b), inputs[i][0], inputs[i][1]);

      System.out.println("Input:    " + inputs[i][0] + ", " + inputs[i][1]);
      System.out.println("Expected: " + outputs[i]);
      System.out.println("Actual:   " + actual);
      System.out.println();
    }
  }

  private static double f(java.util.function.BiFunction<Integer, Integer, Double> f, int a, int b) {
    return f.apply(a, b);
  }
}

Выход:

Input:    3, 4
Expected: 2.0
Actual:   2.0

Input:    -3, 4
Expected: 2.0
Actual:   2.0

Input:    -3, -4
Expected: 2.0
Actual:   2.0

Input:    6, 6
Expected: 3.51
Actual:   3.5147186257614305

Input:    42, 0
Expected: 0.0
Actual:   0.0

Input:    10, 10
Expected: 5.85
Actual:   5.857864376269049

Input:    3, 3
Expected: 1.76
Actual:   1.7573593128807152

1
Вы можете использовать каррирование сохранить байты: a->b->.
Якоб

4

Mathematica, 32 байта

N[Tr@Abs[a={##1}]-Sqrt@Tr[a^2]]&

или

Mathematica, 31 байт

N[Abs@#+Abs@#2-Sqrt[#^2+#2^2]]&

или @ Не предложение дерева

Mathematica, 26 байтов

N[Tr@Abs@{##}-Abs[#+I#2]]&

или предложение @ alephalpha

Mathematica, 19 байт

N[#~Norm~1-Norm@#]&

Хорошо сделано! Вы можете сохранить несколько байтов, используя комплексные числа для евклидовой части:N[Tr@Abs@{##}-Abs[#+I#2]]&
Не дерево

2
N[#~Norm~1-Norm@#]&,
алефальфа

2
@alephalpha #~Norm~1-N@Norm@#&возможно?
Мартин Эндер


4

R , 30 байт

function(v)norm(v)-norm(v,'f')

Принимает vв качестве матрицы из 1 столбца. normвычисляет конкретную норму матрицы, по умолчанию используется норма L1 (taxicab) и fнорма L2 ('f' для фробениусов / евклидов).

Попробуйте онлайн!


Ух, у R оба встроенных, приятно!
BLT

3

Python 2 , 40 38 байт

-2 байта благодаря vaultah.

Забавный факт, 11 байт этого кода были просто скопированы с вопроса и сыграны в гольф.

lambda a,b:abs(a)+abs(b)-(a*a+b*b)**.5

Попробуйте онлайн!



@ Mr.Xcoder Я бы не стал сильно беспокоиться об этом, наверное, я буду вне игры в гольф. : P
полностью человек

@vaultah О, хорошо. Благодарность!
полностью человек

5
abs(a+b*1j)должно работать вместо(a*a+b*b)**.5
SteamyRoot

3

Japt , 11 9 байт

-2 байта благодаря @ETHproductions

Nxa -MhUV

Попробуйте онлайн!

Разъяснения

Nxa -MhUV   // implicit: U and V are input integers, N = [U,V]

N a         // get absolute value of both inputs
 x          // sum those values
    -MhUV   // subtract hypot(U, V) -> sqrt(U^2 + V^2)

Здорово, я думаю, что это первый раз, когда я видел Mhподержанный. Я полагаю, что вы можете сократить Ua +Vaдо Nxa(сумма входов, работающих aна каждом)
ETHproductions

@ETHproductions Ах да, забыл, что сумма имеет необязательный параметр карты. Благодарность!
Джастин Маринер,

Так что * есть «применение для Mh!»: Большинство методов в Japt могут принимать то, что @ETHproductions называет «авто-функцией» в качестве аргумента. См. Этот совет, чтобы узнать больше о них. И завтра я напишу совет о с использованием авто-функций с уменьшением массива для достижения некоторых интересных результатов (например, rwвозвращает наибольшее целое число в массиве).
Shaggy

@ Shaggy Спасибо, у меня была основная идея "авто-функций", но я не понимал, что есть пост с советами по Japt. Собираюсь обязательно просмотреть этот пост.
Джастин Маринер

У нас еще много работы по этому вопросу, поэтому, если у вас есть что-то, что, по вашему мнению, может быть добавлено, сделайте это. Или, если у вас есть запрос, который, по вашему мнению, подойдет вам, сообщите нам об этом в комментариях или присоединяйтесь к нам в чате .
Лохматый

3

Схема - 58 байт.

(define (f a b) (-(+(abs a)(abs b))(sqrt(* a a)(* b b))))

3
Добро пожаловать в PPCG!
Мартин Эндер

Вы можете удалить два пробела - один между defineи (и один между )и (.
clismique

Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
Аарон

(lambda(a b)(...))должно быть достаточно вместо привязки его к имени. Также (sqrt(* a a b b))сэкономил бы пару байтов.
Даниэль Шеплер


3

APL (Dyalog) , 14 байтов

Принимает аргумент в виде xJy , например3J4

||-2+/∘|9 11○⊢

Попробуйте онлайн!

| величина док

| величина аргумента

- минус

2+/ попарная сумма

 из

| величины

9 11.○⊢ реальная и мнимая части аргумента.доктор

Специальным трюком для игры в гольф было использование парного редукции ( 2+/) для предоставления +/аргумента без левых операций, что позволяет избежать скобок:||-(+/∘|9 11○⊢)


3

J, 13 байт

+/@:|-+/&.:*:

Это функция, которая принимает координаты в виде массива, например:

   (+/@:|-+/&.:*:) _3 4
2

Объяснение:

+/             sum
  @:           of
    |          absolutes
     -         minus
      +/       sum
        &.:    under
           *:  square

Хорошее использование &.:- я не знал :о Under.
Иона


2

TI-Basic (TI-84 Plus CE), 10 байтов

sum(abs(Ans))-√(sum(Ans2

Программа, которая вводит в виде списка из двух целых чисел Ans, например, вызов с {3,4}:prgmCROW(замена 3,4на вход иCROW на имя программы).

Объяснение:

sum(abs(Ans))-√(sum(Ans2
        Ans               # The input list of two integers
    abs(   )              # Absolute value of each item in the list
sum(        )             # Sum of the list
                    Ans   # The input list of two integers
                       2  # Square of each item in the list
                sum(      # Sum of the list
              √(          # Square root of the sum
             -            # Difference of the two values

Для меня это выглядит как 24-26 байт, в зависимости от того, как и $ Ans ^ 2 $ кодируются. 10 нажатий клавиш , возможно, но это не одно и то же.
Рэй


Я в основном знаком с TI-89 Basic, где это не так. Возражение снято.
Рэй



2

GNU APL 1.2, 24 байта

∇f P
(+/|P)-(+/P*2)*.5
∇

∇f Pобъявляет функцию, fкоторая принимает вектор, Pсодержащий расстояния в качестве аргумента (например [3, 4])

APL работает с векторами, поэтому +/|Pприменяет |оператор ( absфункцию) к каждому элементу в векторе, а затем оценивает +каждый элемент (поэтому добавьте все элементы). Это дает расстояние такси.

P*2дает вектор, который совпадает Pс квадратом каждого элемента. +/P*2сложить их вместе и затем (с круглыми скобками для приоритета, потому что APL справа налево), *.5чтобы получить квадратный корень. Это дает воронье расстояние.

Добавьте дополнительную пару скобок для расстояния такси для определения приоритета и вычислите разницу.

чтобы закончить функцию.


1
Разве вы не можете использовать анонимную лямбду? {(+/|⍵)-(+/⍵*2)*.5}?
Адам

@ Adám У меня нет большого опыта работы с APL, и новейшая версия интерпретатора GNU (1.7) не будет компилироваться на Mac, поэтому могут быть некоторые ограничения. Я постараюсь позже, чтобы увидеть, если это работает. Спасибо за совет.
Arc676

Почти все функции GNU APL также есть в Dyalog APL, который свободно доступен на Mac . Вы также можете попробовать это онлайн .
Адам

Кроме того, не стесняйтесь присоединиться к чату APL, чтобы узнать больше APL.
Адам

2

J , 9 8 байт

-1 спасибо моему коллеге маршалу.

+&|-|@j.

Попробуйте онлайн!

Принимает A в качестве левого аргумента и B в качестве правого аргумента.

+ сумма

& из

| величины

- минус

| величина

@ из

j.A + B i

Уловка игры в гольф: объедините значения в одно комплексное число, потому что диагональ легко получить таким образом, и в то же время держите их отдельно, потому что сумму легко получить таким образом.


2

Добавить ++ , 59 57 байт

D,f,@@,|@|+
D,g,@@,d*@d*+
_
$f>G>G
V
$g>?>?
S
-G
$f>x>0
O

Попробуйте онлайн!

Это заняло у меня много времени, чтобы решить. Он не округляет окончательный ответ, так как это невозможно в Add ++. Вот как программа работает с входами -3и -4( ACCявляется значением аккумулятора)

D,        Define a function
  f,      called f
  @@,     that takes 2 arguments (e.g. -3, -4)
     |    absolute value;   STACK = [-3, 4]
     @    reverse stack;    STACK = [4, -3]
     |    absolute value;   STACK = [4, 3]
     +    sum;              STACK = [7]
          implicitly return the top of the stack

D,        Define a function
  g,      called g
  @@,     that takes 2 arguments (e.g. -3, -4)
     d    duplicate;  STACK = [-3, -4, -4]
     *    multiply;   STACK = [-3, 16]
     @    reverse;    STACK = [16, -3]
     d    duplicate;  STACK = [16, -3, -3]
     *    multiply;   STACK = [16, 9]
     +    sum;        STACK = [25]
          implicitly return the top of the stack

_         store the inputs in the second stack;  ACC = 0;  STACK = [-3, -4]
$f>G>G    apply f with -3 and -4 as arguments;   ACC = 7;  STACK = []
V         store ACC in the stack;                ACC = 7;  STACK = [7]
$g>?>?    apply g with -3 and -4 as arguments;   ACC = 25; STACK = [7]
S         square root the ACC;                   ACC = 5;  STACK = [7]
-G        subtract the stack value from the ACC; ACC = -2; STACK = []
$f>x>0    apply f with ACC and 0 as arguments;   ACC = 2;  STACK = []
O         output ACC as a number


1

Excel VBA, 34 байта

Функция анонимного непосредственного окна VBE, которая берет входные данные из диапазона [A1:B1]и выводит разницу между расстояниями Евклида и Таксикаба до непосредственного окна VBE.

?[ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)]

1
Это на два байта короче, чтобы поместить его непосредственно в ячейку листа:=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Тост инженера

@EngineerToast, я думал, что уже выставил свои решения Google Sheets / Excel - спасибо за указание на это
Тейлор Скотт





1

Рубин (2.0.0 - 2.3.0), 57 байт

x,y=$*.map(&:to_i);puts x.abs+y.abs-Math.sqrt(x**2+y**2)

Это предполагает получение информации от ARGV, например

ruby -e 'x,y=$*.map(&:to_i);puts x.abs+y.abs-Math.sqrt(x**2+y**2)' -- -3 4

Это похоже на чит, так как Ruby поставляется с математической библиотекой, которая имеет функции abs и sqrt (в отличие от парня, который написал свои собственные функции abs и sqrt, хотя я не видел ничего, специально запрещающего использование таких функций).

Первый трюк использует .mapвместо того, чтобы .eachсохранить байт, а затем использовать &:symbolнотацию для передачи карты выполняемый нами процессto_i для каждого элемента в массиве, и использовать множественное присваивание для присвоения значений x и y.

Более длинная версия будет:

(x, y) = ARGV.map{ |string| string.to_i }

(поскольку map возвращает массив, вероятно, это можно сделать с помощью множественного присваивания, но это исключает любые дополнительные параметры, но мы все равно предполагаем только два ввода)

Затем я просто удалил все пробелы в уравнении.

Вот более длинная версия, 84 байта

$*.map!(&:to_i);puts$*.inject(0){|x,y|x+y.abs}-Math.sqrt($*.inject(0){|x,y|x+y**2})

Цель здесь состояла в том, чтобы не повторяться, например, нужно написать xили absдважды, и мой квадрат дваждыx**2 + y**2

Это не работает.

Но интересно то, что для put не требуется пробел, я думаю, что лексер достаточно умен, чтобы видеть специальный символ и знать, что это специальный var.

injectи reduceявляются синонимами, инъекция имеет подпись

inject(initial) {| memo, obj | block }

В нашем случае нам нужно установить начальное значение в 0, тогда у нас есть наш аккумулятор (то есть: memo = 0) и объект из каждой итерации.

Недостатком этого метода является то, что он будет принимать более двух входных данных и будет суммировать или возводить в квадрат, добавлять, а затем выводить все значения в массиве.

Я думаю - хотя у меня нет Ruby 2.4.0 для тестирования - что это также будет работать, что составляет 72 байта:

$*.map!(&:to_i);puts$*.sub{|x,y|x+y.abs}-Math.sqrt($*.sum{|x,y|x+y**2})

Сумма по умолчанию равна 0 и, насколько я могу судить, работает так же, как инъекция / уменьшение.


Единственная причина, по которой он не использовал встроенные функции, заключалась в том, что у этого языка не было доступного ему для использования. Хороший ответ и добро пожаловать в PPCG! :)
Конор О'Брайен

Добро пожаловать в PPCG! Портал TIO имеет работающий Ruby 2.4.0, который вы можете использовать, чтобы попробовать себя в Интернете. Попробуйте здесь
Value Ink

Воспользовавшись гибкими требованиями ввода / вывода, вы можете избежать разбора и переноса, играя в гольф до 35-байтовой лямбды .
benj2240

1

Google Sheets, 31 байт

Функция рабочего листа, которая берет данные из диапазона [A1:B1]и выводит разницу между расстояниями Евклида и Таксикаба

=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2

Excel, 32 байта

То же, что и выше, но отформатировано для MS Excel

=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)


0

Пип , 15 байт

ABa+ABb-RT$+g*g

Принимает данные из аргументов командной строки. Попробуйте онлайн!

объяснение

В псевдокоде это так 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не сохраняет никаких байтов по сравнению с менее запутанной версией выше.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.