Ворона проти Таксикабу


36

Уявіть, що подорожуєте до точки, що лежить на відстані миль від горизонталі та на відстані 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...і ви округлили ту, що знаходиться під нею.
numbermaniac

4
Я вперше прочитав заголовок як Корова проти Таксикабу і сподівався знайти щось, що стосується фізики зіткнення ...
MooseBoys

Чи можемо ми дати негативні результати?
Адам

@ Adám No. (Оскільки концептуально ти повертаєш відстань, яка завжди позитивна)
DJMcMayhem

Відповіді:


108

Таксі , 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 в історії редагування.

Алгоритм квадратного кореня неізольованого інженера Тоста: Спробуйте в Інтернеті!

Безголовки, з поясненнями:

[ 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.

1
Це божевільно ...
Грифон - Відновіть Моніку

2
@Gryphon божевільна річ - я на 100% впевнений, що зможу видалити, як дві тисячі байтів, як тільки я переглянув свою логіку, поки я не заснув
Стівен

4
4 години заслуговує +1 саме по собі!
Shaggy

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 байт

Гольф:

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

Це приблизно настільки ж основне, як виходить: відніміть два обчислені значення, щоб знайти різницю. Для цього використовується потрійна логіка замість того, Math.abs()щоб зберегти по одному байтові кожного події. На жаль, дужки потрібні через перевагу оператора.

Вихід є тим, що вміє Java double, що є точнішим до двох знаків після коми і відповідає вимозі точності питання.

Безголівки:

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

Математика, 32 байти

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

або

Математика, 31 байт

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

або @ Немає пропозиції дерева

Математика, 26 байт

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

або пропозиція @ алефальфи

Математика, 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 (таксикаб) та 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!: D Більшість методів Japt можуть сприймати те, що @ETHproductions називає" автоматичною функцією "як аргумент. Докладнішу інформацію про них див. У цій пораді . І завтра я напишу підказку на використовуючи автоматичні функції зі скороченням масиву для досягнення цікавих результатів (наприклад, rwповерне найбільше ціле число в масиві)
Shaggy

@Shaggy Спасибі, у мене була основна ідея "автоматичних функцій", але я не усвідомлював, що є пост для підказок Japt. Очевидно перегляньте цю посаду.
Джастін Марінер

Нам ще належить трохи попрацювати над цим питанням, тому якщо у вас є щось, що, на вашу думку, може бути додане, будь ласка, зробіть. Або якщо у вас є запит, який, на вашу думку, вміститься там, повідомте нас у коментарях або приєднайтесь до нас у чаті .
Shaggy

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 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

@ 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

Ruby (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

Це схоже на обман, оскільки Рубі поставляється з математичною lib, яка має функції abs та sqrt (на відміну від хлопця, який написав власні функції abs та sqrt, хоча я не бачив нічого конкретно, що забороняло б використовувати такі функції).

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

Більш тривала версія буде:

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

(оскільки карта повертає масив, множинне призначення - це, мабуть, спосіб це зробити, це викидає будь-які додаткові параметри, але ми припускаємо лише два входи)

Тоді я просто видалив усі пробіли в рівнянні.

Ось довша версія, 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

Це не спрацювало.

Але що цікаво, це те, що місцям не потрібен пробіл, я думаю, що лексер досить розумний, щоб побачити особливі знаки та знати, що це спеціальний вар.

injectі reduceє синонімами, inject має підпис

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

У нашому випадку нам потрібно встановити початковий на 0, тоді ми маємо наш акумулятор (тобто: memo = 0) та об'єкт від кожної ітерації.

Нижній бік цього методу полягає в тому, що він займе більше двох входів і буде або суму, або квадрат, додавання, а потім sqrt всі значення в масиві.

Я думаю - хоча я не маю 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! :)
Conor O'Brien

Ласкаво просимо до PPCG! Портал TIO має працюючий Ruby 2.4.0, який можна використовувати для випробування речей в Інтернеті. Спробуйте тут
Value Ink

Скориставшись гнучкими вимогами до вводу-виводу, ви можете уникнути розбору та розміщення гольфу до 35-байтової лямбда .
benj2240

1

Google Таблиці, 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, оскільки пріоритет операторів зі складанням ще не працює так, як слід. $+повинно бути дещо вищим пріоритет, ніж двійковий -, але на даний момент він розбирає $+(ABg-RT$+g*g), даючи неправильну відповідь. Додавання ($+ABg)-RT$+g*gне зберігає жодних байтів над менш прихованою версією вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.