The Crow vs The Taxicab

36

Bayangkan bepergian ke suatu titik berbaring A mil jauhnya secara horizontal dan B mil jauhnya secara vertikal dari posisi Anda saat ini. Atau dengan kata lain, melakukan perjalanan dari (0, 0)titik ke titik (a, b). Seberapa jauh Anda harus berakhir bepergian? Ini sepertinya pertanyaan yang mudah, tetapi jawabannya tergantung pada siapa yang Anda tanyakan. Jika Anda seekor gagak, dan Anda dapat melakukan perjalanan saat gagak terbang , jarak yang ditempuh hanyalah jarak Euclidean ke (a, b). Ini adalah

sqrt(a^2 + b^2)

Tetapi jika Anda hanya manusia yang membosankan, Anda tidak benar-benar ingin berjalan sejauh itu, jadi Anda harus naik taksi. Sebagian besar taksi tidak akan mengemudi dalam garis lurus menuju tujuan Anda karena mereka umumnya mencoba untuk tetap berada di jalan. Jadi jarak sebenarnya yang akan Anda tempuh adalah jumlah dari jarak vertikal dan jarak horizontal. Atau rumusnya adalah:

abs(a) + abs(b)

Ini disebut Jarak Taksi . Gambar ini dengan baik menunjukkan perbedaan antara keduanya:

masukkan deskripsi gambar di sini

Untuk melakukan perjalanan (6, 6), seekor gagak bisa terbang di garis hijau, dan ini memberi jarak 6 * sqrt(2)sekitar 8,49. Taksi dapat mengambil jalur merah, biru atau kuning, tetapi semuanya akan mengambil 12.

Ini mengarah ke pertanyaan nyata yang saya tanyakan. Jika burung gagak dan taksi keduanya berangkat dari titik (0, 0), dan melakukan perjalanan ke titik (a, b), berapa lama lagi jalur taksi itu? Atau, dalam jargon matematika lebih banyak,

Diberikan vektor dua dimensi, tentukan perbedaan antara norm2 vektor, dan norm1 vektor.

Anda harus menulis program atau fungsi sesingkat mungkin untuk menjawab pertanyaan ini. Anda dapat memilih untuk mengambil 'a' dan 'b' sebagai dua input terpisah, atau sebagai dua item tuple. Anda dapat mengambil input dan output dalam format apa pun yang masuk akal. Jika perbedaannya bukan bilangan bulat, Anda harus akurat ke setidaknya dua tempat desimal.

Anda selalu dapat berasumsi bahwa 'a' dan 'b' akan menjadi bilangan bulat, dan bahwa keduanya tidak akan menjadi 0. (Meskipun mungkin salah satu dari mereka akan menjadi nol)

Seperti biasa, celah standar berlaku dan mencoba membuat program Anda sesingkat mungkin, dihitung dalam byte.

Saya akan menjawab setiap jawaban yang memposting penjelasan tentang bagaimana kode bekerja, dan menunjukkan trik keren yang digunakan untuk menyimpan byte.

Berikut adalah beberapa contoh bagi Anda untuk menguji kode Anda:

#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

Bersenang-senang bermain golf! :)

DJMcMayhem
sumber
9
dapatkah kita mengambil input sebagai bilangan kompleks?
Uriel
Saya pikir testcase untuk 10,10kebutuhan harus 5,86, karena keluar 5.85786...dan Anda membulatkan yang di bawahnya.
numbermaniac
4
Saya pertama kali membaca judul sebagai The Cow vs The Taxicab dan berharap menemukan sesuatu yang melibatkan fisika tabrakan ...
MooseBoys
Bolehkah kita memberikan hasil negatif?
Adám
@ Adám No. (Karena secara konseptual, Anda mengembalikan jarak, yang selalu positif)
DJMcMayhem

Jawaban:

108

Taksi , 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.

Cobalah online!

Engineer Toast , pegolf Taksi yang jauh lebih berpengalaman, memutuskan untuk mengambil waktu (mungkin jauh lebih sedikit daripada yang saya lakukan) dan bermain golf di program Taksi saya dengan menulis ulang pada dasarnya. Anda dapat menemukan badan jawaban lama saya dan tautan ke TIO lama saya di riwayat edit.

Algoritma kuadrat tanpa akar dari Engineer Toast: Cobalah secara online!

Tidak disatukan, dengan penjelasan:

[ 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.
Stephen
sumber
1
Ini gila ...
Gryphon - Reinstate Monica
2
@Gryphon yang gila adalah saya 100% yakin saya dapat menghapus seperti dua ribu byte setelah saya meninjau kembali logika saya sementara saya tidak setengah tertidur
Stephen
4
4 jam layak mendapatkan +1 itu sendiri!
Shaggy
4
Saya yakin jumlah pegolf yang akan membaca seluruh penjelasan akan lebih kecil dari byte Anda: D
Grajdeanu Alex.
1
+1 untuk-1 is waiting at Starchild Numerology.
Keyu Gan
10

Javascript (ES6), 36 byte

-1 byte terima kasih kepada @dtkaias

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

Cuplikan kode contoh:

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

Herman L.
sumber
ES6 tidak punya **.
Neil
2
Sebuah versi ES6 benar mungkin akan 41 byte: (x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y).
Neil
@ DanEsparza Ini jelas digunakan untuk. Inilah yang dimaksud dengan sejarah revisi ...
Neil
Mengapa tidak a=>b=>a+b-Math.hypot(a,b)?
dtkaias
1
Benar, bagaimana dengan (x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y), selama 36 byte, ES6 juga kompatibel
dtkaias
8

Julia, 20 byte

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

Mengambil adan bsebagai daftar.

normArgumen kedua Julia default ke 2 - maka ini akan setara dengan norm(x, 1) - norm(x, 2).

Uriel
sumber
Saya juga berpikir untuk menggunakan Julia!
enedil
Sangat mirip dengan jawaban MATLAB yang akan saya posting.
TheIncredibleZ1
6

Java 8, 47 byte

Golf:

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

Ini tentang dasar yang didapat: kurangi dua nilai yang dihitung untuk menemukan perbedaan. Ini menggunakan logika terner sebagai gantinyaMath.abs() menyimpan satu byte setiap kejadian. Sayangnya, tanda kurung diperlukan karena prioritas operator.

Outputnya adalah apa pun milik Java double bisa dimiliki , yang akurat untuk lebih dari dua tempat desimal dan memenuhi persyaratan akurasi pertanyaan.

Tidak Disatukan:

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

Keluaran:

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
Khaled.K
sumber
1
Anda dapat menggunakan currying untuk menyimpan byte: a->b->.
Jakob
4

Mathematica, 32 byte

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

atau

Mathematica, 31 byte

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

atau @Tidak saran pohon

Mathematica, 26 byte

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

atau saran @ alephalpha

Mathematica, 19 byte

N[#~Norm~1-Norm@#]&
J42161217
sumber
Kerja bagus! Anda dapat menyimpan beberapa byte dengan menggunakan bilangan kompleks untuk bagian euclidean:N[Tr@Abs@{##}-Abs[#+I#2]]&
Bukan pohon
2
N[#~Norm~1-Norm@#]&.
alephalpha
2
@alephalpha #~Norm~1-N@Norm@#&mungkin?
Martin Ender
4

Dyalog APL, 13 byte

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

Cobalah online!

Penjelasan (input X):

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

R , 30 byte

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

Dibawa vsebagai matriks 1-kolom. normmenghitung norma tertentu dari sebuah matriks, dengan standarnya adalah norma L1 (taksi), dan fnorma L2 ('f' untuk Frobenius / Euclidean).

Cobalah online!

Giuseppe
sumber
Wow, R memiliki built-in, bagus!
BLT
3

Python 2 , 40 38 byte

-2 byte berkat vaultah.

Fakta menyenangkan, 11 byte kode ini baru saja disalin dari pertanyaan dan di-golf.

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

Cobalah online!

benar-benar manusiawi
sumber
1
Saya telah menjadi ninja
Tn. Xcoder
@ Mr.Xcoder Saya tidak akan terlalu khawatir tentang itu, saya mungkin akan bermain golf. : P
totallyhuman
@ vaultah Oh, bagus. Terima kasih!
manusia
5
abs(a+b*1j)harus bekerja alih-alih(a*a+b*b)**.5
SteamyRoot
3

Japt , 11 9 byte

-2 byte terima kasih kepada @ETHproductions

Nxa -MhUV

Cobalah online!

Dijelaskan

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)
Justin Mariner
sumber
Bagus, saya pikir ini pertama kali saya melihat Mhdigunakan. Saya percaya Anda dapat mempersingkat Ua +Vake Nxa(jumlah input, menjalankan apada masing-masing)
ETHproductions
@ ETHproductions Oh benar, lupa bahwa jumlah memiliki parameter peta opsional. Terima kasih!
Justin Mariner
Jadi ada * digunakan untuk Mh !: D Sebagian besar metode di Japt dapat mengambil apa yang disebut @ETHproductions sebagai "fungsi-otomatis" sebagai argumen. Lihat tip ini untuk mengetahui lebih lanjut tentang hal itu. menggunakan fungsi-otomatis dengan pengurangan larik untuk mencapai beberapa hasil menarik (mis., rwakan mengembalikan bilangan bulat terbesar dalam larik)
Shaggy
@Shaggy Terima kasih, saya punya ide dasar "fungsi-otomatis" tetapi tidak menyadari ada posting untuk tips Japt. Pasti akan melihat-lihat posting itu.
Justin Mariner
Kami masih memiliki sedikit pekerjaan untuk dilakukan pada pertanyaan itu jadi jika Anda memiliki sesuatu yang Anda rasa dapat ditambahkan, silakan lakukan. Atau jika Anda memiliki pertanyaan yang menurut Anda cocok di sana, beri tahu kami di komentar atau bergabunglah dengan kami di ruang obrolan .
Shaggy
3

Skema - 58 byte.

(define (f a b) (-(+(abs a)(abs b))(sqrt(* a a)(* b b))))
GenRincewind
sumber
3
Selamat datang di PPCG!
Martin Ender
Anda dapat menghapus dua spasi - satu antara definedan (, dan satu antara )dan (.
clismique
Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
Harun
(lambda(a b)(...))harus memadai alih-alih mengikatnya ke nama. Juga, (sqrt(* a a b b))akan menghemat beberapa byte.
Daniel Schepler
3

Pyth, 8 byte

-s.aMQ.a

Cobalah online. Suite uji.

Penjelasan

-s.aMQ.aQ      Q (input) appended implicitly
  .aMQ         absolute values of input vector
 s             sum
-              subtract
      .aQ      norm2 of input vector
PurkkaKoodari
sumber
3

APL (Dyalog) , 14 byte

Mengambil argumen dalam bentuk xJy, mis3J4

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

Cobalah online!

| besarnya Doc

| besarnya argumen

- minus

2+/ jumlah pasangan-bijaksana

 dari

| besarnya

9 11.○⊢ argumen itu nyata dan bagian imajiner. Dokter

Trik khusus untuk bermain golf adalah penggunaan pengurangan berpasangan ( 2+/) untuk memasok +/dengan argumen no-op kiri, dengan demikian menghindari tanda kurung:||-(+/∘|9 11○⊢)

Adm
sumber
3

J, 13 byte

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

Ini adalah fungsi yang menggunakan koordinat sebagai larik, misalnya:

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

Penjelasan:

+/             sum
  @:           of
    |          absolutes
     -         minus
      +/       sum
        &.:    under
           *:  square
marinus
sumber
Penggunaan yang bagus &.:- Saya tidak mengetahui :tentang Under.
Jonah
2

05AB1E , 7 byte

ÄO¹nOt-

Cobalah online!

Penjelasan

Ä        # absolute value of inputs
 O       # sum
  ¹      # push input again
   n     # square
    O    # sum
     t   # sqrt
      -  # subtract
Emigna
sumber
2

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

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

Program yang dimasukkan sebagai daftar dua bilangan bulat Ans, misalnya panggilan dengan {3,4}:prgmCROW(menggantikan 3,4dengan input danCROW dengan nama program).

Penjelasan:

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
pizzapants184
sumber
Itu terlihat seperti 24-26 byte bagi saya, tergantung pada bagaimana dan $ Ans ^ 2 $ dikodekan. 10 penekanan tombol , mungkin, tapi itu bukan hal yang sama.
Ray
@ Ray TI-Basic adalah bahasa tokenized .
pizzapants184
Saya kebanyakan akrab dengan TI-89 Basic, di mana bukan itu masalahnya. Keberatan ditarik.
Ray
2

MATL , 8 7 byte

|sG2&|-

Cobalah online!

Penjelasan

|    % 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
Luis Mendo
sumber
2

Common Lisp, 57 byte

(defun g(a b)(+(abs a)(abs b)(-(sqrt(+(* a a)(* b b))))))

Cobalah online!

Renzo
sumber
2

GNU APL 1.2, 24 byte

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

∇f Pmendeklarasikan fungsi fyang mengambil vektor yang Pberisi jarak sebagai argumen (misalnya [3, 4])

APL beroperasi pada vektor, jadi +/|Pterapkan |operator ( absfungsi) untuk setiap elemen dalam vektor dan kemudian evaluasi +pada setiap elemen (jadi tambahkan semua elemen). Ini memberi jarak taksi.

P*2menghasilkan vektor yang sama Ptetapi dengan setiap elemen kuadrat. +/P*2untuk menambahkan mereka bersama-sama dan kemudian (dengan tanda kurung untuk diutamakan karena APL dari kanan ke kiri)*.5 untuk mendapatkan akar kuadrat. Ini memberi jarak gagak.

Tambahkan sepasang kurung tambahan untuk jarak taksi sebagai prioritas dan hitung perbedaannya.

untuk mengakhiri fungsi.

Arc676
sumber
1
Tidak bisakah Anda menggunakan lambda anonim? {(+/|⍵)-(+/⍵*2)*.5}?
Adám
@ Adám Saya tidak punya banyak pengalaman dengan APL dan versi terbaru dari penerjemah GNU (1.7) tidak dapat dikompilasi di Mac, jadi mungkin ada beberapa batasan. Saya akan mencoba nanti untuk melihat apakah itu berhasil. Terima kasih atas tipnya.
Arc676
Hampir semua fitur GNU APL juga ada di Dyalog APL, yang tersedia secara gratis di Mac . Anda juga dapat mencobanya online .
Adám
Juga, silakan bergabung dengan ruang obrolan APL untuk mempelajari lebih lanjut APL.
Adám
2

J , 9 8 byte

-1 terima kasih kepada kolega saya Marshall.

+&|-|@j.

Cobalah online!

Membawa A sebagai argumen kiri dan B sebagai argumen kanan.

+ jumlah

& dari

| besarnya

- minus

| besarnya

@ dari

j.A + B i

Trik golf: menggabungkan nilai-nilai ke bilangan kompleks tunggal karena diagonal mudah didapat seperti itu, sementara juga menjaga mereka terpisah karena jumlahnya mudah didapat seperti itu.

Adm
sumber
2

Tambahkan ++ , 59 57 byte

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

Cobalah online!

Saya butuh waktu lama untuk menyelesaikannya. Itu tidak melengkapi jawaban akhir karena itu tidak mungkin di Add ++. Ini adalah cara kerja program dengan input -3dan -4( ACCadalah nilai akumulator)

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
caird coinheringaahing
sumber
1

PHP> = 7.1, 54 byte

[,$x,$y]=$argv;echo abs($x)+abs($y)-sqrt($x**2+$y**2);

PHP Sandbox Online

PHP , 55 byte

<?=abs($x=$argv[1])+abs($y=$argv[2])-sqrt($x**2+$y**2);

Cobalah online!

PHP , 60 byte

dengan fungsi alih-alih program lengkap

function f($x,$y){return abs($x)+abs($y)-sqrt($x**2+$y**2);}

Cobalah online!

Jörg Hülsermann
sumber
1

Excel VBA, 34 Bytes

Fungsi jendela langsung VBE anonim yang mengambil input dari jangkauan [A1:B1]dan menampilkan perbedaan antara jarak Euclidean dan Taxicab ke jendela langsung VBE.

?[ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)]
Taylor Scott
sumber
1
Ini dua byte lebih pendek untuk meletakkannya langsung di sel dalam lembaran:=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Engineer Toast
@ EngineerToast, saya pikir saya sudah memasang Google Sheets / Excel Solutions - terima kasih telah menunjukkan ini
Taylor Scott
1

,,,, 18 byte

Pada dasarnya port jawaban Python saya.

a:↔a:0•2*⇆2*+√↔+↔-
benar-benar manusiawi
sumber
1

Rubi , 31 byte

Membuat bilangan kompleks untuk menghitung jarak dengan.

->x,y{x.abs+y.abs-(x+y*1i).abs}

Cobalah online!

Nilai Tinta
sumber
1

Ruby (2.0.0 - 2.3.0), 57bytes

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

Ini mengasumsikan mengambil input dari misalnya ARGV

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

Ini terasa seperti cheat karena Ruby datang dengan lib matematika yang memiliki fungsi abs dan sqrt (tidak seperti orang yang menulis sendiri fungsi abs dan sqrt, meskipun saya tidak melihat sesuatu yang secara khusus melarang penggunaan fungsi-fungsi tersebut).

Trik pertama adalah menggunakan .mapalih-alih .eachmenyimpan byte, kemudian menggunakan &:symbolnotasi untuk meneruskan peta proc yang kita jalankanto_i pada setiap item dalam array, dan menggunakan beberapa penugasan untuk menetapkan nilai ke x dan y.

Versi yang lebih panjang adalah:

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

(karena peta mengembalikan array, beberapa penugasan mungkin merupakan cara untuk melakukannya, ini membuang parameter tambahan apa pun, tetapi kami tetap mengasumsikan hanya dua input)

Lalu saya baru saja menghapus semua spasi dalam persamaan.

Ini versi yang lebih panjang, 84 byte

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

Tujuannya di sini adalah untuk tidak mengulangi sendiri, misalnya harus menulis xatau absdua kali dan kuadrat dua kalix**2 + y**2

Tidak bekerja.

Tapi yang menarik adalah bahwa menempatkan tidak memerlukan ruang, saya kira lexer cukup pintar untuk melihat char khusus dan tahu itu var khusus.

injectdan reducemerupakan sinonim, inject memiliki tanda tangan

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

Dalam kasus kami, kami perlu mengatur inisial ke 0, maka kami memiliki akumulator kami (yaitu: memo = 0) dan objek dari setiap iterasi.

Sisi buruk dari metode ini adalah ia akan mengambil lebih dari dua input dan akan menjumlahkan atau persegi, tambahkan, kemudian sqrt semua nilai dalam array.

Saya pikir - walaupun saya tidak memiliki Ruby 2.4.0 untuk diuji - bahwa ini akan bekerja juga, yang datang pada 72 byte:

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

Jumlah default ke 0 dan sejauh yang saya tahu, berfungsi sama seperti menyuntikkan / mengurangi.

qubitrenegade
sumber
Satu-satunya alasan dia tidak menggunakan bawaan adalah karena bahasa itu tidak tersedia untuk digunakan. Jawaban yang bagus, dan selamat datang di PPCG! :)
Conor O'Brien
Selamat datang di PPCG! Portal TIO memiliki Ruby 2.4.0 yang berfungsi yang dapat Anda gunakan untuk mencoba berbagai hal secara online. Cobalah di sini
Value Ink
Memanfaatkan persyaratan i / o yang fleksibel, Anda dapat menghindari parsing dan put-ing, bermain golf hingga lambda 35-byte .
benj2240
1

Google Sheets, 31 Bytes

Fungsi lembar kerja yang mengambil input dari jarak [A1:B1]dan menghasilkan perbedaan antara jarak Euclidean dan Taxicab

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

Excel, 32 byte

Sama seperti di atas tetapi diformat untuk MS Excel

=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Taylor Scott
sumber
1

Pyth , 7 byte

a.aQsa0

Coba di sini


Pyth ,  25  23 byte

Ini adalah solusi awal, solusi Pyth pertama saya yang tidak terlalu sepele dan Anda dapat melihat betapa buruknya saya bermain golf di Pyth :)

K.aswJ.asw-+KJ^+^K2^J2 .5

Cobalah online!

Tuan Xcoder
sumber
0

Pip , 15 byte

ABa+ABb-RT$+g*g

Mengambil input dari argumen baris perintah. Cobalah online!

Penjelasan

Dalam pseudocode, ini abs(a) + abs(b) - sqrt(fold+(g*g)). adan bmerupakan dua cmdline args pertama, dan gmerupakan daftar cmdline args (yaitu argv). The *Operator vectorizes, seperti banyak operator Pip, sehingga $+g*gadalah hal yang sama sepertia*a + b*b . Sisanya cukup mudah.

Sayangnya, saya tidak dapat menyimpan byte dengan $+ABg, karena prioritas operator dengan flip tidak berfungsi sebagaimana mestinya. $+seharusnya sedikit lebih diutamakan daripada biner -, tetapi pada saat itu diuraikan sebagai $+(ABg-RT$+g*g), memberikan jawaban yang salah. Melakukan ($+ABg)-RT$+g*gtidak menyimpan byte apa pun di atas versi yang kurang jelas di atas.

DLosc
sumber