pengantar
The Hausdorff jarak mengukur perbedaan antara dua himpunan bagian dari ruang metrik. Secara intuitif, ruang metrik hanya beberapa set dengan fungsi jarak built-in; dalam tantangan ini, kita akan menggunakan bilangan asli dengan jarak biasa d(a, b) := abs(a - b)
. Jarak Hausdorff antara dua set hingga tidak kosong A
dan B
diberikan oleh
max(max(min(d(a, b) for b in B) for a in A),
max(min(d(a, b) for a in A) for b in B))
dalam notasi seperti Python. Jarak Hausdorff dapat dihitung dengan menemukan elemen A
yang jarak ke elemen terdekat B
maksimal, dan elemen B
yang jaraknya ke elemen terdekat A
maksimal, dan kemudian mengambil maksimum jarak ini. Dengan kata lain, jika jarak Hausdorff adalah d
, maka setiap elemen A
berada dalam jarak d
beberapa elemen B
, dan sebaliknya.
Memasukkan
Input Anda adalah satu daftar bilangan bulat. Ini hanya berisi elemen-elemen 0,1,2,3
, yang menandakan apakah indeks daftar yang diberikan adalah elemen yang bukan A
atau bukan B
, hanya A
, saja B
, atau keduanya A
dan B
. Misalnya, input [0,1,1,0,2,3]
berarti bahwa A = {1,2,5}
dan B = {4,5}
, jika kami menggunakan pengindeksan berbasis 0 (yang tidak membuat perbedaan, karena metrik kami adalah terjemahan invarian).
Keluaran
Output Anda adalah jarak Hausdorff antara A
dan B
; dalam contoh di atas, itu 3
. Jika salah satu set kosong, maka jaraknya tidak ditentukan, dan Anda akan kembali -1
.
Aturan
Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.
Uji Kasus
[] -> -1
[0] -> -1
[0,1,0] -> -1
[2,0,0,2] -> -1
[0,1,2,3] -> 1
[0,3,3,0,0,0,0,3] -> 0
[1,0,0,1,0,0,1,3,1] -> 7
[1,0,0,0,0,3,0,0,0,0,2] -> 5
[0,1,1,3,1,3,2,1,1,3,0,3] -> 2
[2,2,2,1,2,0,3,1,3,1,0,3] -> 3
[1,3,0,2,0,2,2,1,0,3,2,1,1,2,2] -> 2
[1,0,1,1,2,0,1,2,3,1,0,0,0,1,2,0] -> 4
max(max(min(d(a, b) for b in B) for a in A))
seharusnya sudah cukup. Ini karenad(a,b)
mengembalikan nilai absolut, dan karena itu kedua fungsi maks akan mengembalikan angka yang sama setiap waktu.A
sangat dekat dengan salah satunyaB
, tetapi ada elemen yangB
sangat jauh dariA
(misalnya, jikaA
merupakan subset dariB
). Dalam hal itu, rumus pendeknya salah.Jawaban:
CJam,
5352463837 byteMengambil input pada STDIN sebagai larik gaya CJam:
Berikut ini adalah test harness yang mengubah semua test case ke format ini dan menjalankan kodenya. Meskipun hasilnya ada di bidang input, hasilnya tidak digunakan oleh kode (hapus jika Anda tidak mempercayai saya :)).
Penjelasan
Pertama, kami mengurai input untuk mendapatkan dua set A dan B:
Dan sekarang kami menemukan perbedaan absolut dan memilih maks menit:
Perhatikan bahwa kami telah menyimpan array kosong yang dihasilkan dari awal
0
di bagian bawah tumpukan sepanjang waktu, tetapi array kosong tidak berkontribusi apa pun pada output.sumber
CJam,
57 5652 byteSaya pikir ini bisa sedikit golf, tapi begini:
Input masuk seperti daftar gaya CJam, mis.
Cara kerjanya :
Kode ini dibagi menjadi dua bagian:
Parsing input ke dalam daftar
A
danB
:Melakukan tindakan yang diperlukan pada dua pasang
A
danB
:Cobalah online di sini
sumber
Lua, 235 byte
Jelas bukan pemenang, tetapi setidaknya tantangan yang menyenangkan.
Input berfungsi seperti ini:
... dan inilah skrip pengujian:
... menghasilkan ...
sumber
Pyth,
43403938 byteAlgoritme saya beroperasi langsung pada string input dan tidak pernah mengonversi angka ini. Ini hanya menghitung sekali maksimal dan tidak pernah minimum.
Terima kasih kepada @isaacg untuk menghemat satu byte.
Cobalah secara online: Pyth Compiler / Executor
Penjelasan:
Pertama saya akan memasukkan banyak nol di depan input.
Lalu saya mendefinisikan fungsi pembantu
y
, yang memberi tahu jika indeks daftar (seperti input satu) muncul di kedua set A dan BEgy([0, 1, 0, 0, 1, 1]) = False
, tetapiy([0, 1, 0, 2]) = y([3]) = True
.Setelah itu saya periksa dulu apakah hasilnya
-1
.Sekarang untuk hal-hal menarik:
Perhatikan, bahwa saya akan selalu menemukan nomor
T
, karena saya sudah tahu bahwa indeks muncul di kedua set dalam daftar J. Angka tersebut maksimallength(Q)
. Ini juga alasan untuk memasukkan angka nol. Jika ada setidaknyalength(Q)
nol yang dimasukkan,k-T
selalu>= 0
, yang diperlukan untuk mengiris daftar. Jadi mengapa saya memasukkan2^length(Q)
angka nol dan bukanlength(Q)
angka nol? Dalam test-case[]
saya membutuhkan setidaknya 1 nol, jika tidakyJ
akan mengembalikan kesalahan.sumber
><Cab
sama dengan:Cba
.Mathematica, 88 byte
sumber
m=MaxValue;Max[m[RegionDistance[#[[1]],s],s\[Element]#[[2]]]/.m[__]->-1&/@{#,Reverse@c}]&
yang kemudian dapat diterapkan pada objek multidimensi seperti itu%@{Sphere[],Line[{{1,1,0},{3,3,3}}]}
Haskell,
145126124 byteUji coba:
s
memfilter bilangan asli sesuai dengan predikatt
dan daftar inputx
.#
menghitung jarak maksimum parameterd
dane
.%
menangkap set kosong A atau B atau mengambil maksimum akhir darid#e
dane#d
.f
adalah fungsi utama yang memanggil%
dengan set A dan B.Sunting: @Zgarb menemukan banyak byte untuk disimpan; @ ali0sha yang lain 2. Terima kasih!
sumber
mod 2
tampaknya tidak perlu. Anda juga dapat mengambil manfaat dari tidak mendefinisikana
danb
secara eksplisit.[]%_= -1
- tetapi Anda mengalahkan upaya saya dengan tangan ini :)Perl,
5655Menambahkan +2 untuk
-lp
.Daftar input harus diberikan pada stdin tanpa spasi, misalnya:
hausdorf.pl
:Untuk mendukung spasi di antara elemen-elemen dari daftar input cukup bagi final
$q
dengan 2 untuk biaya 2 strokesumber
Python 2, 124
Ini pasti terasa suboptimal. Baiklah.
sumber
APL (49)
Testcases:
Penjelasan:
⍳⍴⍵
: dapatkan daftar angka dari 1 hingga panjang daftar input↓2 2⊤⍵
: untuk setiap nilai dalam daftar input, dapatkan byte pertama dan byte kedua∆←(
...)/⊂⍳⍴⍵
: untuk kedua daftar byte, pilih nilai yang sesuai dari⍳⍴⍵
. Menyimpan ini dalam∆
.(⊂⍬)∊∆
...:¯1
: jika daftar ini berisi daftar kosong, kembali-1
. Jika tidak:|∘.-/∆
: dapatkan perbedaan absolut antara setiap pasangan nilai, dengan memberikan matriks(+,⍉¨)
: dapatkan salinan yang diputar dan tidak diputar dari matriks itu{⌈/⌊/⍵}
: untuk kedua matriks, dapatkan maksimum dari baris minimum⌈/
: lalu dapatkan yang maksimalsumber
,X
, untuk membedakannya dari skalarX
.)Perl,
189176157BSekarang dengan status 500% lebih.
Terbaca:
Contoh penggunaan:
memasukkan
perl golf.pl < input
sumber
Clojure, 167 byte
Harus ada jalan yang lebih pendek ... Apakah ada?
sumber