Tulis sebuah program yang akan mengambil input 2 array integer dan mengembalikan nilai yang sebenarnya jika ada elemen yang ada di kedua array, atau yang salah sebaliknya. Solusi yang jelas untuk masalah ini adalah untuk beralih melalui setiap elemen dalam array pertama dan membandingkannya dengan masing-masing elemen dalam yang kedua, tetapi inilah masalahnya: Program Anda harus memiliki kompleksitas algoritme paling banyak, dalam kasus terburuk, O ( NlogN), di mana N adalah panjang array yang lebih panjang,
Kasus uji:
{1,2,3,4,-5},{5,7,6,8} -> false
{},{0} -> false
{},{} -> false
{1,2},{3,3} -> false
{3,2,1},{-4,3,5,6} -> true
{2,3},{2,2} -> true
Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
O(n log n)
dapat dilakukan secara umum, tetapi klarifikasi tentang hanya menangani bilangan bulat asli berarti bahwa dalam beberapa bahasa dengan kisaran bilangan bulat terbatas solusi linier dimungkinkan (misalnya dengan tabel pencarian ukuran 2 ^ 64)Jawaban:
Sebenarnya 1 byte
Cobalah online!
Ini hanyalah persimpangan yang ditetapkan bawaan. Nilai yang dihasilkan adalah persimpangan dari dua set - daftar yang tidak kosong (yang merupakan nilai kebenaran) jika ada persimpangan, dan daftar kosong (yang merupakan nilai falsey) sebaliknya.
Kompleksitas
Menurut Python Wiki , set persimpangan memiliki kompleksitas waktu terburuk
O(N*M)
(di manaN
danM
adalah panjang dari dua set). Namun, kompleksitas waktu hanya seburuk itu ketika dua set berisi objek berbeda yang semuanya memiliki nilai hash yang sama (misalnya,{"some string"} & {hash("some string")}
). Karena elemen himpunan hanya bilangan bulat dalam kasus ini (dan tidak ada dua bilangan bulat yang memiliki nilai yang sama kecuali jika keduanya sama), kompleksitas kasus terburuk yang sebenarnya adalahO(min(N, M))
(linear dalam panjang yang lebih kecil dari dua himpunan). Konstruksi setiap set adalahO(N)
(linier dalam jumlah elemen), sehingga kompleksitas keseluruhannyaO(max(N, M))
(kompleksitas didominasi oleh konstruksi set yang lebih besar).sumber
TSQL,
403736 byteSQL tidak memiliki array, melainkan menggunakan tabel
Mengembalikan -1 untuk true atau 0 untuk false
Cobalah
sumber
Ruby, 37 byte:
Seperti dalam definisi: "program yang akan mengambil input 2 array integer dan mengembalikan nilai kebenaran jika ...", ini adalah sebuah program, menerima 2 array sebagai string dalam input, mengembalikan benar atau salah.
sebagai fungsi - 14 byte:
Kompleksitas:
Dokumentasi ruby dari operator itnersection (&) mengatakan "Ia membandingkan elemen menggunakan metode hash dan eql mereka untuk efisiensi.", Yang saya kira persis apa yang kita cari.
Secara empiris:
Yang sepertinya mengkonfirmasi itu.
sumber
Perl, 25 + 1 = 26 byte bekerja sama dengan Dada
Jalankan dengan
-a
(penalti 1 byte).Versi yang lebih baik dari program di bawah ini (yang disimpan untuk melihat sejarah solusi, dan untuk menunjukkan solusi yang saya temukan sendiri; ia juga memiliki lebih banyak penjelasan). The
-a
pilihan berbunyi array ruang yang dipisahkan sebagai masukan, menyimpannya dalam@F
. Kami menggunakan%a
kamus (diakses sebagai$a{$_}
) untuk menyimpan bitmask di mana array input input berada, dan mencetak1
setiap kali kita melihat elemen di kedua array, yaitu nilai yang lebih tinggi dari 2 di dalam bitmask yang dihasilkan (untungnya, perbandingan pengembalian gagal string nol, jadiprint
tidak melakukan apa-apa). Kami tidak dapat menggunakansay
karena baris baru benar di Perl. Kinerja asimtotik sama dengan versi program yang lebih lama (tetapi lebih cepat dalam hal faktor konstan).Perl, 44 + 1 = 45 byte
Jalankan dengan
-p
(penalti 1 byte). Masukkan satu larik per baris, pisahkan elemen dengan spasi.Ini bekerja melalui membuat tabel hash
%a
yang menyimpan bitmask dari array input yang nilainya telah terlihat. Jika terlihat di kedua array di baris 1 dan di baris 2, bitmask akan menyimpan nilai 3. Membalikkan nilai hash dan melihat apakah 3 memiliki kunci yang sesuai beri tahu kami jika ada nilai yang sama.Kompleksitas dari algoritma ini adalah O (n) jika Anda menganggap pembuatan hash sebagai waktu yang konstan (yaitu, jika Anda memiliki bilangan bulat yang terikat, seperti Perl). Jika menggunakan bignum integer (yang bisa menjadi input ke dalam program ini, karena ia meninggalkan input sebagai string), kompleksitas algoritma itu sendiri secara nominal akan menjadi O (n log n) untuk setiap pembuatan hash, dan O (n) untuk pembalikan hash, yang menambahkan hingga O (n log n). Namun, algoritma hashing Perl mengalami potensi kinerja O (n²) dengan input yang dipilih secara jahat; algoritma ini diacak, untuk membuatnya tidak mungkin untuk menentukan apa input itu (dan mungkin itu tidak dapat dipicu hanya dengan integer), sehingga diperdebatkan dengan kelas kompleksitas apa yang "secara moral" diperhitungkan. Untungnya, ini tidak masalah jika ada
Kode ini akan berfungsi untuk input selain bilangan bulat, tetapi tidak akan berfungsi untuk lebih dari dua array (karena
3
hardcode dan karena input pada baris ketiga tidak akan bitmask dengan benar, karena itu bukan kekuatan 2). Agak menyebalkan, kode secara alami mengembalikan salah satu elemen duplikat, yang benar dalam hampir semua kasus, tetapi"0"
falsey dalam Perl dan elemen duplikat yang valid dalam array. Karena itu, saya harus menyia-nyiakan tiga byte yang bergantung+
pada output, yang merupakan cara termurah yang saya temukan untuk memberikan output yang benar dalam kasus tepi array yang tumpang tindih0
. Jika saya diperbolehkan untuk menggunakan pengertian tentang truthy dan falsey dari bahasa lain selain Perl (di mana string tidak kosong adalah truthy), Anda dapat mengubah"+$_"
untuk$_
menyelamatkan tiga byte.sumber
perl -apE '$\|=($a{$_}|=$.)==3for@F}{'
harus memiliki perilaku yang sama selama 17 byte kurang ;-)-a
bendera itu. Itu sepertinya membantu di sini, bukan? Saya pikir Anda dapat menyimpan dua byte lagi, ($\|=}{
danprint
memiliki panjang yang sama, dan yang terakhir memungkinkan Anda untuk menghindari-p
bendera dan dengan demikian satu byte penalti; dan==3
dapat diganti dengan>2
untuk byte lain). Sayang sekali bahwa$1
, dll, sudah menjadi variabel, atau kita bisa menyimpan tiga byte lainnya dengan menggunakan seluruh ruang nama variabel sebagai tabel hash.-a
(dan-F
) cukup nyaman di PPCG (lebih dari pada anagolf karena di sana harganya lebih mahal)! Karena Anda membutuhkan ruang setelahprint
, panjangnya sama dengan-p ... $\=}{
, tapi mengapa tidak. (ya, sangat menyedihkan kita tidak bisa memodifikasi$1
dll.)p$\|=}{
(tujuh karakter, denganp
menjadi penalti); Saya punyaprint
(enam karakter, termasuk spasi). Saya pikir Anda melewatkan|
perhitungan Anda di sana.Python2 -
4130 byteSet persimpangan: O (min (N, M)) di mana N dan M adalah panjang set.
Konversi dari daftar ke set: O (maks (N, M))
set(a).intersection(b)
->set(a)&set(b)
f=
sumber
set(a)&set(b)
alih-alih memanggil metode persimpangan.{0}
kemudian Anda bisa turun ke 28 byte:lambda a,b:set(a)&set(b)>{0}
{1}&{1}
itu benar, sementara{1}&{2}
itu palsu. Anda bisa melakukannyalambda a,b:a&b
.f=
tidak bekerja.Aksioma, 439 byte
ini mengonversi daftar pertama dalam daftar sebagai [[i, 1], [i, 2] ...] daftar kedua dalam daftar sebagai [[1, i], [0, i] ...] di mana saya adalah variabel imajiner daripada menggabungkan daftar 2, dan membuat satu jenis yang akan menemukan jika ada satu elemen dari daftar 1 dalam daftar 2 sehingga akhirnya O (N log N) di mana N = daftar panjang 1 + daftar panjang 2
ungolfed
hasil
saya tidak mengerti mengapa itu "membersihkan" kode untuk r dan ...
sumber
PowerShell,
88787723 byteTerima kasih kepada @briantist karena telah memangkas 54 byte kekalahan dari jawaban asli saya, lebih banyak kata dengan mempersingkat
-IncludeEqual
,-ExcludeDifferent
dan-Not
!Saya tidak dapat menemukan sumber untuk
Compare-Object
(diff
adalah alias untukCompare-Object
), jadi saya tidak yakin tentang kompleksitas waktu.sumber
!!(diff -inc -ex $A $B)
-i
bukan-inc
, tetapi dalam 5+-Information*
parameter umum membuat-i
ambigu.if
pernyataan itu; Anda tidak membutuhkannya sama sekali! Juga v5 datang dengan Windows 10, dan v5.1 dilengkapi dengan Server 2016. Anda juga dapat mengunduh dan menginstal WMF5 sejauh, saya percaya, Windows 7 / 2008R2. Telah dirilis untuk beberapa waktu sekarang!Compare-Object
, saya ragu bahwa ini adalah O (NlogN). Kedua, mengambil input melalui variabel yang ditentukan sebelumnya adalah tidak-tidak, jadi Anda akan membutuhkanparam($a,$b)
di depan atau yang serupa.param($A,$B)!!(diff -Inc -Ex $A $B)
- Lalu, simpan itu sebagai file .ps1 dan panggil dari baris perintah dengan array sebagai argumen, sepertiPS C:\Scripts>.\same-element.ps1 @(1,2) @(2,3)
PHP , 15 byte
Cobalah online!
PHP built-in, sebagai fungsi callable / lambda. Return adalah nilai PHP
truthy
/ yangfalsey
dapat diuji. Juga, sesuai dengan pengiriman PHP lainnya, implementasi ini harus memenuhi persyaratan kompleksitas tantangan ( StackExchange ).sumber
R, 23 byte
Jika kita berasumsi bahwa akan selalu ada satu dan hanya satu elemen yang cocok dan itu
1
adalah nilai yang sebenarnya (yang ada di R ), maka kita dapat menulis:yaitu 21 byte.
sumber
PHP,
5551 bytePenggunaan: simpan dalam file dan panggilan dari browser:
intersect.php?a[]=1&a[]=2&a[]=3&b[]=0&b[]=4&b[]=5
output0
untukfalse
.intersect.php?a[]=1&a[]=2&a[]=3&b[]=0&b[]=4&b[]=1
output1
untuktrue
.Tentang kompleksitas, saya tidak dapat menemukan referensi tetapi menurut posting StackOverflow ini skrip harus OK
sumber
GolfScript, 1 byte
Jika mengambil input secara langsung karena array pada stack diperbolehkan, solusi GolfScript satu byte ini harus memenuhi spesifikasi:
Jika I / O berbasis teks diperlukan, input harus dievaluasi terlebih dahulu, mendorong panjangnya hingga dua byte:
Kedua solusi ini menggunakan operator persimpangan GolfScript array, yang diimplementasikan menggunakan operator yang sesuai di Ruby . Mereka mengembalikan array kosong (yang salah) jika array tidak mengandung elemen yang cocok, atau array yang tidak kosong (yang sebenarnya) berisi semua elemen yang cocok sebaliknya.
Sejauh ini saya belum dapat menemukan dokumentasi tentang implementasi internal atau kompleksitas asimptotik dari operator persimpangan Ruby array, di luar pernyataan singkat bahwa "Itu membandingkan elemen menggunakan hash dan eql? Metode mereka untuk efisiensi." Namun, implementasi yang masuk akal menggunakan tabel hash akan berjalan dalam waktu O ( n ) (dengan asumsi bahwa hashing dan perbandingan adalah O (1)), dan beberapa pengujian kinerja cepat menunjukkan bahwa ini memang masalahnya:
Tes ini dilakukan dengan menggunakan program GolfScript
~2?.2*,/&
, yang mengambil integer k , menghasilkan urutan aritmatika elemen 2 × 2 k , membaginya menjadi dua array elemen 2 k dan menghitung persimpangan mereka (jelas kosong). Bintang merah menunjukkan waktu eksekusi terukur t dalam detik (pada skala logaritmik) untuk berbagai nilai k , sedangkan garis hijau memplot fungsi t = c × 2 k , di mana konstanta penskalaan c ≈ 2 −17.075 dipilih sebagai yang terbaik. sesuai dengan data yang diukur.(Perhatikan bahwa, di sebidang log-log seperti ini, setiap fungsi polinomial dalam bentuk t = c × (2 k ) a akan menghasilkan garis lurus. Namun, kemiringan garis tergantung pada eksponen sebuah , dan data tentu konsisten dengan sebuah = 1 seperti yang ditunjukkan oleh garis hijau di atas. FWIW, numerik kecocokan eksponen untuk kumpulan data ini adalah sebuah ≈ 1,00789.)
sumber
JavaScript (ES6), 39 byte
Akan lebih buruk dari O (n + m) tetapi mudah-mudahan tidak seburuk O (n * m).
sumber
Rust, 103 byte
Mengambil dua irisan array (atau referensi ke array penuh, mereka merujuk ke irisan secara otomatis), menggabungkannya ke dalam set, dan memeriksa non-disjointness. Saya tidak begitu yakin bagaimana set union diimplementasikan di pustaka standar Rust, tetapi seharusnya O (n + m) paling buruk.
Tanpa menggunakan koleksi, alternatif termudah yang saya lihat adalah mengurutkan kedua array, lalu melangkahinya dengan hati-hati untuk mencari duplikat. Sesuatu seperti ini
Tapi itu membutuhkan terlalu banyak mutasi untuk bisa bermain golf di Rust IMO :)
sumber
Python, 11 byte
Builtin yang membutuhkan 2 set dan melakukan persimpangan pada mereka
sumber
Aksioma,
50221 byteungolfed
g (a, b) mendapatkan array yang lebih besar daripada win a dan b; misalkan memiliki elemen N: susunan array itu, lakukan pencarian biner dengan elemen array lainnya. Ini akan menjadi O (Nlog (N)). Ini mengembalikan 0 tanpa elemen a dalam b, 1 jika tidak.
hasil
sumber
Jelly , 2 byte
Cobalah online!
Penjelasan
sumber