Con quạ vs Taxicab


36

Hãy tưởng tượng đi du lịch đến một điểm nằm Một dặm chiều ngang và B dặm theo chiều dọc từ vị trí hiện tại của bạn. Hay nói cách khác, đi từ (0, 0)điểm đến (a, b). Bạn cần bao xa để kết thúc chuyến đi? Đây có vẻ như là một câu hỏi đơn giản, nhưng câu trả lời phụ thuộc vào người bạn hỏi. Nếu bạn là một con quạ, và bạn có thể di chuyển theo đường chim bay , khoảng cách đi du lịch chỉ là khoảng cách Euclide để (a, b). Đây là

sqrt(a^2 + b^2)

Nhưng nếu bạn chỉ là một con người nhàm chán, bạn không thực sự muốn đi bộ xa như vậy, vì vậy bạn sẽ cần phải đi taxi. Hầu hết các xe taxi sẽ không lái xe theo đường thẳng về đích của bạn bởi vì họ thường cố gắng ở trên đường. Vì vậy, khoảng cách thực sự bạn sẽ đi du lịch là tổng khoảng cách dọc và khoảng cách ngang. Hoặc công thức là:

abs(a) + abs(b)

Đây được gọi là Khoảng cách Taxicab . Bức ảnh này thể hiện độc đáo sự khác biệt giữa hai:

nhập mô tả hình ảnh ở đây

Để di chuyển đến (6, 6), một con quạ chỉ có thể bay trên đường màu xanh lá cây và điều này cho khoảng cách 6 * sqrt(2)khoảng 8,49. Một chiếc taxi có thể đi theo con đường màu đỏ, màu xanh hoặc màu vàng, nhưng tất cả chúng sẽ mất 12 con.

Điều này dẫn đến câu hỏi thực sự tôi đang hỏi. Nếu cả một con quạ và một chiếc taxi rời khỏi điểm (0, 0), và đi đến điểm (a, b), thì con đường của taxi dài hơn bao lâu? Hoặc, trong thuật ngữ toán học nhiều hơn,

Cho một vectơ hai chiều, xác định sự khác biệt giữa Norm2 của vectơ và Norm1 của vectơ.

Bạn phải viết chương trình hoặc chức năng ngắn nhất có thể để trả lời câu hỏi này. Bạn có thể chọn lấy 'a' và 'b' làm hai đầu vào riêng biệt hoặc làm một bộ hai mục. Bạn có thể lấy đầu vào và đầu ra ở bất kỳ định dạng hợp lý. Nếu sự khác biệt là một số nguyên, bạn phải chính xác đến ít nhất hai chữ số thập phân.

Bạn luôn có thể giả sử rằng 'a' và 'b' sẽ là số nguyên và cả hai sẽ không bằng 0. (Mặc dù có thể một trong hai số đó sẽ bằng 0)

Như thường lệ, các sơ hở tiêu chuẩn áp dụng và cố gắng làm cho chương trình của bạn càng ngắn càng tốt, được tính bằng byte.

Tôi sẽ nêu lên bất kỳ câu trả lời nào đăng một lời giải thích về cách thức hoạt động của mã và chứng minh bất kỳ thủ thuật hay ho nào được sử dụng để lưu byte.

Dưới đây là một số ví dụ để bạn kiểm tra mã của mình trên:

#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

Chúc bạn chơi golf vui vẻ! :)


9
chúng ta có thể lấy đầu vào là số phức?
Uriel

Tôi nghĩ rằng giá trị thử nghiệm 10,10cần phải là 5,86, vì nó được đưa ra 5.85786...và bạn làm tròn cái bên dưới nó.
numbermaniac

4
Lần đầu tiên tôi đọc tiêu đề là The Cow vs The Taxicab và hy vọng tìm thấy thứ gì đó liên quan đến vật lý va chạm ...
MooseBoys

Chúng tôi có thể cho kết quả tiêu cực?
Adám

@ Adám số (Vì về mặt khái niệm, bạn sẽ trả lại một khoảng cách, điều này luôn luôn tích cực)
DJMcMayhem

Câu trả lời:


108

Taxi , 7394 3773 byte

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.

Hãy thử trực tuyến!

Kỹ sư Toast , một tay golf Taxi có nhiều kinh nghiệm hơn, đã quyết định dành một chút thời gian (có lẽ ít hơn nhiều so với tôi đã làm) và đánh golf chương trình Taxi của tôi bằng cách viết lại nó. Bạn có thể tìm thấy nội dung câu trả lời cũ của tôi và các liên kết đến các TIO cũ của tôi trong lịch sử chỉnh sửa.

Thuật toán căn bậc hai không có kỹ năng của Toast: Hãy thử trực tuyến!

Ungolfed, với lời giải thích:

[ 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
Điều này thật điên rồ ...
Gryphon - Tái lập Monica

2
@Gryphon điều điên rồ là tôi chắc chắn 100% tôi có thể loại bỏ như hai nghìn byte một khi tôi xem lại logic của mình trong khi tôi không ngủ được một nửa
Stephen

4
4 giờ là xứng đáng với +1 trong chính nó!
Xù xì

4
Tôi chắc rằng số người chơi gôn sẽ đọc toàn bộ lời giải thích sẽ nhỏ hơn số byte của bạn: D
Grajdeanu Alex.

1
+1 cho-1 is waiting at Starchild Numerology.
Keyu Gan

10

Javascript (ES6), 36 byte

-1 byte nhờ @dtkaias

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

Đoạn mã ví dụ:

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 không có **.
Neil

2
Một phiên bản ES6 thực sự có thể sẽ là 41 byte : (x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y).
Neil

@DanEsparza Nó rõ ràng được sử dụng để. Đây là những gì lịch sử sửa đổi dành cho ...
Neil

Tại sao không a=>b=>a+b-Math.hypot(a,b)?
dtkaias

1
Phải, làm thế nào (x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y), với 36 byte, ES6 cũng tương thích
dtkaias

8

Julia, 20 byte

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

Đưa abnhư một danh sách.

normĐối số thứ hai của Julia mặc định là 2 - do đó, điều này sẽ tương đương với norm(x, 1) - norm(x, 2).


Tôi cũng đã nghĩ về việc sử dụng Julia!
enedil

Rất giống với câu trả lời MATLAB tôi sắp đăng.
TheIncredibleZ1

6

Java 8, 47 byte

Chơi gôn

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

Đây là về cơ bản như nó được: trừ hai giá trị được tính toán để tìm sự khác biệt. Điều này sử dụng logic ternary thay vì Math.abs()để lưu một byte mỗi lần xuất hiện. Thật không may, các dấu ngoặc đơn được yêu cầu do ưu tiên toán tử.

Đầu ra là bất cứ thứ gì Java doublecó thể giữ, chính xác đến hơn hai chữ số thập phân và đáp ứng yêu cầu độ chính xác của câu hỏi.

Ung dung:

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);
  }
}

Đầu ra:

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
Bạn có thể sử dụng currying để lưu một byte : a->b->.
Jakob

4

Toán học, 32 byte

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

hoặc là

Toán học, 31 byte

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

hoặc @Không đề xuất của cây

Toán học, 26 byte

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

hoặc đề xuất của @ alephalpha

Toán học, 19 byte

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

Công việc tốt đẹp! Bạn có thể lưu một vài byte bằng cách sử dụng các số phức cho phần euclide:N[Tr@Abs@{##}-Abs[#+I#2]]&
Không phải là một cây vào

2
N[#~Norm~1-Norm@#]&.
alephalpha

2
@alephalpha #~Norm~1-N@Norm@#&có lẽ?
Martin Ender

4

APL Dyalog, 13 byte

+/∘|-.5*⍨+.×⍨

Hãy thử trực tuyến!

Giải thích (đầu vào X):

+/∘|     - Sum of the element-wise absolute value of X
-        - Minus
.5*⍨+.×⍨ - Euclidean distance = sqrt(X . X)

4

R , 30 byte

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

Thực hiện vdưới dạng ma trận 1 cột. normtính một chỉ tiêu cụ thể của ma trận, với mặc định là định mức L1 (taxicab) và fđịnh mức L2 ( 'f'đối với Frobenius / Euclidean).

Hãy thử trực tuyến!


Wow, R có cả tích hợp, tốt đẹp!
BLT

3

Python 2 , 40 38 byte

-2 byte nhờ vaultah.

Thực tế thú vị, 11 byte của mã này chỉ được sao chép từ câu hỏi và đánh gôn.

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

Hãy thử trực tuyến!


1
Tôi đã trở thành ninja
Ông Xcoder

@ Mr.Xcoder Tôi sẽ không quá lo lắng về điều đó, có lẽ tôi sẽ bị đánh golf. : P
hoàn toàn là

@vaultah ơi, điểm tốt. Cảm ơn!
hoàn toàn là

5
abs(a+b*1j)nên hoạt động thay vì(a*a+b*b)**.5
SteamyRoot

3

Japt , 11 9 byte

-2 byte nhờ @ETHproductions

Nxa -MhUV

Hãy thử trực tuyến!

Giải thích

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)

Thật tuyệt, tôi nghĩ đây là lần đầu tiên tôi thấy Mhsử dụng. Tôi tin rằng bạn có thể rút ngắn Ua +Vatới Nxa(tổng đầu vào, chạy atrên mỗi)
ETHproductions

@ETHproductions Oh phải, quên rằng tổng có tham số bản đồ tùy chọn. Cảm ơn!
Justin Mariner

Vì vậy, * là "a use for Mh!: D Hầu hết các phương thức trong Japt có thể lấy cái mà @ETHproductions gọi là" chức năng tự động "làm đối số. Xem mẹo này để biết thêm về chúng. Và tôi sẽ viết một mẹo vào ngày mai sử dụng các hàm tự động với việc giảm mảng để đạt được một số kết quả thú vị (ví dụ: rwsẽ trả về số nguyên lớn nhất trong một mảng).
Shaggy

@Shaggy Cảm ơn, tôi đã có ý tưởng cơ bản về "chức năng tự động" nhưng không nhận ra có một bài đăng cho các mẹo của Japt. Gonna chắc chắn nhìn qua bài viết đó.
Justin Mariner

Chúng tôi vẫn còn một chút việc phải làm cho câu hỏi đó vì vậy nếu bạn có điều gì đó mà bạn cảm thấy có thể được thêm vào, xin vui lòng làm. Hoặc nếu bạn có một truy vấn mà bạn nghĩ sẽ phù hợp ở đó, hãy cho chúng tôi biết trong các nhận xét hoặc tham gia với chúng tôi trong phòng chat .
Xù xì

3

Sơ đồ - 58 byte.

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

3
Chào mừng đến với PPCG!
Martin Ender

Bạn có thể xóa hai khoảng trắng - một giữa define(và giữa một )(.
clismique

Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
Aaron

(lambda(a b)(...))nên là đủ thay vì ràng buộc nó với một tên. Ngoài ra, (sqrt(* a a b b))sẽ tiết kiệm một vài byte.
Daniel Schepler


3

APL (Dyalog) , 14 byte

Đưa ra đối số trong mẫu xJy, ví dụ3J4

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

Hãy thử trực tuyến!

| độ lớn của Đốc

| tầm quan trọng của đối số

- dấu trừ

2+/ tổng số khôn ngoan

 của

| tầm quan trọng của

9 11.○⊢ phần thực và phần ảo của đối số. Bác sĩ

Thủ thuật đặc biệt để chơi gôn là sử dụng phép giảm cặp ( 2+/) để cung cấp +/một đối số không có op, do đó tránh được dấu ngoặc đơn:||-(+/∘|9 11○⊢)


3

J, 13 byte

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

Đây là một hàm lấy tọa độ dưới dạng một mảng, ví dụ:

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

Giải trình:

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

Cách sử dụng tuyệt vời &.:- Tôi không biết :về Under.
Giô-na


2

TI-Basic (TI-84 Plus CE), 10 byte

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

Chương trình nhập dưới dạng danh sách hai số nguyên Ans, ví dụ: gọi bằng {3,4}:prgmCROW(thay thế3,4 bằng đầu vào và CROWbằng tên của chương trình).

Giải trình:

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

Nó trông giống như 24-26 byte đối với tôi, tùy thuộc vào cách thức và $ Ans ^ 2 $ được mã hóa. 10 tổ hợp phím , có lẽ, nhưng đó không phải là điều tương tự.
Ray


Tôi hầu như quen thuộc với TI-89 Basic, trong đó không phải vậy. Phản đối rút.
Ray

2

MATL , 8 7 byte

|sG2&|-

Hãy thử trực tuyến!

Giải trình

|    % Implicit input: vector of two numbers. Absolute value, element-wise
s    % Sum of vector
G    % Push input again
2    % Push 2
&|   % 2-norm of input
-    % Subtract. Implicit display


2

GNU APL 1.2, 24 byte

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

∇f Pkhai báo một hàm flấy một vectơP chứa khoảng cách làm đối số (ví dụ [3, 4])

APL hoạt động trên các vectơ, do đó +/|Páp dụng |toán tử ( abshàm) cho từng phần tử trong vectơ và sau đó đánh giá +trên từng phần tử (vì vậy thêm tất cả các phần tử). Điều này cho khoảng cách taxi.

P*2mang lại một vectơ giống như Pnhưng với mỗi phần tử bình phương. +/P*2để thêm chúng lại với nhau và sau đó (với dấu ngoặc đơn được ưu tiên vì APL là từ phải sang trái)*.5 để lấy căn bậc hai. Điều này cho khoảng cách quạ.

Thêm một cặp dấu ngoặc đơn cho khoảng cách taxi được ưu tiên và tính toán sự khác biệt.

để kết thúc chức năng.


1
Bạn không thể sử dụng lambda ẩn danh? {(+/|⍵)-(+/⍵*2)*.5}?
Adám

@ Adám Tôi không có nhiều kinh nghiệm với APL và phiên bản mới nhất của trình thông dịch GNU (1.7) sẽ không được biên dịch trên Mac, vì vậy có thể có một số hạn chế. Tôi sẽ thử sau để xem nó hoạt động. Cảm ơn vì tiền hỗ trợ.
Arc676

Hầu như tất cả các tính năng của GNU APL cũng có trong Dyalog APL, có sẵn miễn phí trên Mac . Bạn cũng có thể thử nó trực tuyến .
Adám

Ngoài ra, vui lòng tham gia phòng trò chuyện APL để tìm hiểu thêm APL.
Adám

2

J , 9 8 byte

-1 cảm ơn đồng nghiệp Marshall của tôi.

+&|-|@j.

Hãy thử trực tuyến!

Đưa A làm đối số trái và B là đối số phải.

+ Tổng

& của

| độ lớn

- dấu trừ

| độ lớn

@ của

j.A + B i

Bí quyết chơi gôn: kết hợp các giá trị thành một số phức duy nhất vì đường chéo dễ dàng có được như vậy, trong khi cũng giữ chúng tách biệt vì tổng dễ dàng có được như vậy.


2

Thêm ++ , 59 57 byte

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

Hãy thử trực tuyến!

Điều này khiến tôi mất nhiều thời gian để giải quyết. Nó không làm tròn câu trả lời cuối cùng vì điều đó là không thể trong Add ++. Đây là cách chương trình hoạt động với các đầu vào -3-4( ACClà giá trị tích lũy)

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

VBA Excel, 34 byte

Hàm cửa sổ tức thời VBE ẩn danh lấy đầu vào từ phạm vi [A1:B1]và xuất ra sự khác biệt giữa khoảng cách Euclide và Taxicab đến cửa sổ ngay lập tức VBE.

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

1
Đó là hai byte ngắn hơn để đặt nó trực tiếp vào một ô trong trang tính:=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Kỹ sư Toast

@EngineerToast, tôi nghĩ rằng tôi đã đưa ra Giải pháp Google Sheets / Excel của mình - cảm ơn vì đã chỉ ra điều này
Taylor Scott





1

Ruby (2.0.0 - 2.3.0), 57byte

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

Giả định này lấy đầu vào từ ARGV, vd

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

Cảm giác này giống như một trò gian lận vì Ruby đi kèm với một lib toán học có các hàm abs và sqrt (không giống như anh chàng đã viết các hàm abs và sqrt của riêng mình, mặc dù tôi không thấy gì đặc biệt cấm sử dụng các hàm đó).

Thủ thuật đầu tiên là sử dụng .mapthay vì .eachlưu một byte, sau đó sử dụng &:symbolký hiệu để truyền bản đồ mà chúng tôi thực hiệnto_i trên mỗi mục trong mảng và sử dụng nhiều phép gán để gán giá trị cho x và y.

Một phiên bản dài hơn sẽ là:

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

(vì bản đồ trả về một mảng, nhiều phép gán có thể là cách thực hiện, điều này sẽ loại bỏ mọi tham số bổ sung, nhưng chúng tôi chỉ giả sử hai đầu vào)

Sau đó, tôi chỉ cần loại bỏ tất cả các không gian trong phương trình.

Đây là phiên bản dài hơn, 84 byte

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

Mục tiêu ở đây là không lặp lại chính mình, ví dụ như phải viết xhoặc abshai lần và bình phương của tôi hai lầnx**2 + y**2

Nó không hoạt động.

Nhưng điều thú vị là không cần một khoảng trống, tôi đoán rằng nhà từ vựng đủ thông minh để xem char đặc biệt và biết đó là một var đặc biệt.

injectreducelà từ đồng nghĩa, tiêm có chữ ký của

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

Trong trường hợp của chúng ta, chúng ta cần đặt giá trị ban đầu là 0, sau đó chúng ta có bộ tích lũy của chúng ta (tức là: memo = 0) và đối tượng từ mỗi lần lặp.

Mặt trái của phương pháp này là nó sẽ mất nhiều hơn hai đầu vào và sẽ tính tổng hoặc bình phương, thêm, sau đó sqrt tất cả các giá trị trong mảng.

Tôi nghĩ - mặc dù tôi không có Ruby 2.4.0 để kiểm tra - rằng nó cũng sẽ hoạt động với 72 byte:

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

Sum mặc định là 0 và theo như tôi có thể nói, hoạt động tương tự như tiêm / giảm.


Lý do duy nhất anh ta không sử dụng nội dung là vì ngôn ngữ đó không có sẵn cho anh ta sử dụng. Câu trả lời hay, và chào mừng bạn đến với PPCG! :)
Conor O'Brien

Chào mừng đến với PPCG! Cổng thông tin TIO có Ruby 2.4.0 hoạt động mà bạn có thể sử dụng để thử mọi thứ trực tuyến. Dùng thử tại đây
Ink Ink

Tận dụng các yêu cầu i / o linh hoạt, bạn có thể tránh phân tích cú pháp và đặt, đánh gôn xuống lambda 35 byte .
benj2240

1

Google Sheets, 31 byte

Hàm bảng tính lấy đầu vào từ phạm vi [A1:B1]và xuất ra sự khác biệt giữa khoảng cách Euclide và Taxicab

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

Excel, 32 byte

Tương tự như trên nhưng được định dạng cho MS Excel

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


0

Pip , 15 byte

ABa+ABb-RT$+g*g

Lấy đầu vào từ các đối số dòng lệnh. Hãy thử trực tuyến!

Giải trình

Trong mã giả, đây là abs(a) + abs(b) - sqrt(fold+(g*g)). ablà hai đối số cmdline đầu tiên, và glà danh sách các cmdline args (tức là argv). Các *nhà điều hành vectorizes, giống như nhiều nhà khai thác Pip, vì vậy $+g*glà điều tương tự như a*a + b*b. Phần còn lại là khá đơn giản.

Thật không may, tôi không thể lưu bất kỳ byte nào $+ABg, bởi vì quyền ưu tiên của các toán tử có nếp gấp chưa hoạt động như vậy. $+nên được ưu tiên cao hơn một chút so với nhị phân -, nhưng tại thời điểm này, nó phân tích thành $+(ABg-RT$+g*g), đưa ra câu trả lời sai. Làm ($+ABg)-RT$+g*gkhông tiết kiệm bất kỳ byte so với phiên bản ít obfuscated trên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.