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:
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! :)
10,10
kebutuhan harus 5,86, karena keluar5.85786...
dan Anda membulatkan yang di bawahnya.Jawaban:
Taksi ,
73943773 byteCobalah 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:
sumber
-1 is waiting at Starchild Numerology.
Javascript (ES6), 36 byte
-1 byte terima kasih kepada @dtkaias
Cuplikan kode contoh:
sumber
**
.(x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y)
.a=>b=>a+b-Math.hypot(a,b)
?(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)
, selama 36 byte, ES6 juga kompatibelJulia, 20 byte
Mengambil
a
danb
sebagai daftar.norm
Argumen kedua Julia default ke 2 - maka ini akan setara dengannorm(x, 1) - norm(x, 2)
.sumber
Java 8, 47 byte
Golf:
Ini tentang dasar yang didapat: kurangi dua nilai yang dihitung untuk menemukan perbedaan. Ini menggunakan logika terner sebagai gantinya
Math.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:
Keluaran:
sumber
a->b->
.Mathematica, 32 byte
atau
Mathematica, 31 byte
atau @Tidak saran pohon
Mathematica, 26 byte
atau saran @ alephalpha
Mathematica, 19 byte
sumber
N[Tr@Abs@{##}-Abs[#+I#2]]&
N[#~Norm~1-Norm@#]&
.#~Norm~1-N@Norm@#&
mungkin?Dyalog APL, 13 byte
Cobalah online!
Penjelasan (input X):
sumber
R , 30 byte
Dibawa
v
sebagai matriks 1-kolom.norm
menghitung norma tertentu dari sebuah matriks, dengan standarnya adalah norma L1 (taksi), danf
norma L2 ('f'
untuk Frobenius / Euclidean).Cobalah online!
sumber
Python 2 ,
4038 byte-2 byte berkat vaultah.
Fakta menyenangkan, 11 byte kode ini baru saja disalin dari pertanyaan dan di-golf.
Cobalah online!
sumber
abs(a+b*1j)
harus bekerja alih-alih(a*a+b*b)**.5
Japt ,
119 byte-2 byte terima kasih kepada @ETHproductions
Cobalah online!
Dijelaskan
sumber
Mh
digunakan. Saya percaya Anda dapat mempersingkatUa +Va
keNxa
(jumlah input, menjalankana
pada masing-masing)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.,rw
akan mengembalikan bilangan bulat terbesar dalam larik)Skema - 58 byte.
sumber
define
dan(
, dan satu antara)
dan(
.Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
(lambda(a b)(...))
harus memadai alih-alih mengikatnya ke nama. Juga,(sqrt(* a a b b))
akan menghemat beberapa byte.Pyth, 8 byte
Cobalah online. Suite uji.
Penjelasan
sumber
APL (Dyalog) , 14 byte
Mengambil argumen dalam bentuk
xJy
, mis3J4
Cobalah online!
|
besarnya Doc|
besarnya argumen-
minus2+/
jumlah pasangan-bijaksana∘
dari|
besarnya9 11.○⊢
argumen itu nyata dan bagian imajiner. DokterTrik khusus untuk bermain golf adalah penggunaan pengurangan berpasangan (
2+/
) untuk memasok+/
dengan argumen no-op kiri, dengan demikian menghindari tanda kurung:||-(+/∘|9 11○⊢)
sumber
J, 13 byte
Ini adalah fungsi yang menggunakan koordinat sebagai larik, misalnya:
Penjelasan:
sumber
&.:
- Saya tidak mengetahui:
tentang Under.05AB1E , 7 byte
Cobalah online!
Penjelasan
sumber
TI-Basic (TI-84 Plus CE), 10 byte
Program yang dimasukkan sebagai daftar dua bilangan bulat
Ans
, misalnya panggilan dengan{3,4}:prgmCROW
(menggantikan3,4
dengan input danCROW
dengan nama program).Penjelasan:
sumber
√
dan $ Ans ^ 2 $ dikodekan. 10 penekanan tombol , mungkin, tapi itu bukan hal yang sama.MATL ,
87 byteCobalah online!
Penjelasan
sumber
Common Lisp, 57 byte
Cobalah online!
sumber
GNU APL 1.2, 24 byte
∇f P
mendeklarasikan fungsif
yang mengambil vektor yangP
berisi jarak sebagai argumen (misalnya[3, 4]
)APL beroperasi pada vektor, jadi
+/|P
terapkan|
operator (abs
fungsi) untuk setiap elemen dalam vektor dan kemudian evaluasi+
pada setiap elemen (jadi tambahkan semua elemen). Ini memberi jarak taksi.P*2
menghasilkan vektor yang samaP
tetapi dengan setiap elemen kuadrat.+/P*2
untuk 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.sumber
{(+/|⍵)-(+/⍵*2)*.5}
?J ,
98 byte-1 terima kasih kepada kolega saya Marshall.
Cobalah online!
Membawa A sebagai argumen kiri dan B sebagai argumen kanan.
+
jumlah&
dari|
besarnya-
minus|
besarnya@
darij.
A + B iTrik 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.
sumber
Tambahkan ++ ,
5957 byteCobalah 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
-3
dan-4
(ACC
adalah nilai akumulator)sumber
PHP> = 7.1, 54 byte
PHP Sandbox Online
PHP , 55 byte
Cobalah online!
PHP , 60 byte
dengan fungsi alih-alih program lengkap
Cobalah online!
sumber
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.sumber
=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Pari / GP , 26 byte
Cobalah online!
sumber
Jelly , 7 byte
Cobalah online!
Format adalah daftar dua angka.
sumber
,,,, 18 byte
Pada dasarnya port jawaban Python saya.
sumber
Rubi , 31 byte
Membuat bilangan kompleks untuk menghitung jarak dengan.
Cobalah online!
sumber
Ruby (2.0.0 - 2.3.0), 57bytes
Ini mengasumsikan mengambil input dari misalnya ARGV
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
.map
alih-alih.each
menyimpan byte, kemudian menggunakan&:symbol
notasi 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:
(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
Tujuannya di sini adalah untuk tidak mengulangi sendiri, misalnya harus menulis
x
atauabs
dua 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.
inject
danreduce
merupakan sinonim, inject memiliki tanda tanganDalam 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:
Jumlah default ke 0 dan sejauh yang saya tahu, berfungsi sama seperti menyuntikkan / mengurangi.
sumber
Google Sheets, 31 Bytes
Fungsi lembar kerja yang mengambil input dari jarak
[A1:B1]
dan menghasilkan perbedaan antara jarak Euclidean dan TaxicabExcel, 32 byte
Sama seperti di atas tetapi diformat untuk MS Excel
sumber
Pyth , 7 byte
Coba di sini
Pyth ,
2523 byteIni adalah solusi awal, solusi Pyth pertama saya yang tidak terlalu sepele dan Anda dapat melihat betapa buruknya saya bermain golf di Pyth :)
Cobalah online!
sumber
Pip , 15 byte
Mengambil input dari argumen baris perintah. Cobalah online!
Penjelasan
Dalam pseudocode, ini
abs(a) + abs(b) - sqrt(fold+(g*g))
.a
danb
merupakan dua cmdline args pertama, dang
merupakan daftar cmdline args (yaitu argv). The*
Operator vectorizes, seperti banyak operator Pip, sehingga$+g*g
adalah 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*g
tidak menyimpan byte apa pun di atas versi yang kurang jelas di atas.sumber