Tugas Anda di sini sederhana:
Diberikan daftar set bilangan bulat, temukan serikat set. Dengan kata lain, temukan daftar terpendek dari himpunan integer yang berisi semua elemen dalam daftar himpunan asli (tetapi tidak ada elemen lain). Sebagai contoh:
[1,5] and [3,9] becomes [1,9] as it contains all of the elements in both [1,5] and [3,9]
[1,3] and [5,9] stays as [1,3] and [5,9], because you don't want to include 4
Set diberi notasi menggunakan notasi rentang: [1,4]
berarti bilangan bulat 1,2,3,4
. Set juga bisa tidak dibatasi: [3,]
berarti semua bilangan bulat >= 3
, dan [,-1]
berarti semua bilangan bulat <= -1
. Dijamin bahwa elemen pertama dari jangkauan tidak akan lebih besar dari yang kedua.
Anda dapat memilih untuk mengambil set dalam notasi string, atau Anda dapat menggunakan 2-elemen tupel, menggunakan konstanta non-integer sebagai nilai "tak terbatas". Anda dapat menggunakan dua konstanta berbeda untuk mewakili batas atas tak terbatas dan batas bawah tak terbatas. Misalnya, dalam Javascript, Anda bisa menggunakan [3,{}]
untuk memberi tahu semua bilangan bulat >= 3
, selama Anda secara konsisten digunakan {}
di semua kasus uji.
Kasus uji:
[1,3] => [1,3]
[1,] => [1,]
[,9] => [,9]
[,] => [,]
[1,3],[4,9] => [1,9]
[1,5],[8,9] => [1,5],[8,9]
[1,5],[1,5] => [1,5]
[1,5],[3,7] => [1,7]
[-10,7],[1,5] => [-10,7]
[1,1],[2,2],[3,3] => [1,3]
[3,7],[1,5] => [1,7]
[1,4],[8,] => [1,4],[8,]
[1,4],[-1,] => [-1,]
[1,4],[,5] => [,5]
[1,4],[,-10] => [1,4],[,-10]
[1,4],[,] => [,]
[1,4],[3,7],[8,9],[11,20] => [1,9],[11,20]
Ini kode-golf , jadi buat jawaban Anda sesingkat mungkin!
sumber
Infinity
bukan{}
?[1.0, 3.0]
bukan[1, 3]
?[1.0, 3.0], [4.0, 5.0]
masih harus menjadi[1.0, 5.0]
Infinity
dan-Infinity
sebagai masukan, apakah itu diizinkan untuk mengambil-999999
dan999999
(atau bahkan lebih besar / lebih kecil) sebagai gantinya?Jawaban:
R +
intervals
,90 8781 byteCobalah online!
Input adalah daftar interval.
-Inf
danInf
merupakan R bawaan untuk minus / plus tak terhingga. Output adalah matriks kolom interval.Tidak biasanya penggemar menggunakan perpustakaan non-standar tapi yang ini menyenangkan. TIO belum
intervals
diinstal. Anda dapat mencobanya di instalasi Anda sendiri atau di https://rdrr.io/snippets/The
intervals
paket dukungan nyata dan integer (type = "Z"
interval) danreduce
fungsi built-in untuk apa yang diinginkan tantangan, tapi output tampaknya default ke interval terbuka, sehingga diperlukan untuk mendapatkan hasil yang diinginkan.close_intervals
+c(1,-1)
Versi lama memiliki contoh dalam daftar daftar yang mungkin nyaman jadi saya meninggalkan tautan di sini.
sumber
function(...)close_intervals(reduce(Intervals(rbind(...),type="Z")))
. Atau bahkan lebih baik Anda dapat memeriksa dengan op jika mereka mengizinkan matriks sebagai input.reduce
danReduce
di sana.f=function(...)t(reduce(Intervals(rbind(...),type="Z")))+c(1,-1)
?JavaScript (ES6), 103 byte
Disimpan 1 byte berkat @Shaggy
1 byte disimpan berkat @KevinCruijssen
Berharap
+/-Infinity
untuk nilai yang tak terbatas.Cobalah online!
Bagaimana?
Kami pertama-tama menyortir interval berdasarkan batas bawahnya, dari terendah ke tertinggi. Batas atas diabaikan.
Berkomentar
sumber
p<=M+1
bisap<M+2
?Python 2 ,
118113112111106105104101 byteDisimpan satu byte terima kasih kepada Mr.Xcoder, satu terima kasih kepada Jonathan Frech, dan tiga terima kasih untuk Dead Possum.
Cobalah online!
sumber
(b,c),
menghemat satu byte.g
berarti fungsi Andaf
tidak dapat digunakan kembali dan karenanya tidak valid?return
menjadiprint
untuk byte lain.Ruby ,
8976 byteCobalah online!
Urutkan array, lalu ratakan dengan menambahkan semua rentang ke yang pertama: jika rentang tumpang tindih dengan yang sebelumnya, buang 2 elemen dari 3 yang terakhir (hanya maks.)
Batalkan semuanya di akhir.
sumber
Pascal (FPC) ,
367362357 byteCobalah online!
Sebuah prosedur yang mengambil array dinamis dari catatan yang terdiri dari 2 batas jangkauan, memodifikasi array di tempat dan kemudian menulisnya pada output standar, satu rentang per baris. (Maaf untuk kalimat bengkok itu.) Penggunaan
1/0
untuk ubounded dan-1/0
down.Versi yang mudah dibaca
Akan menyenangkan untuk hanya mengembalikan array dengan jumlah elemen yang dikoreksi, tetapi array dinamis yang diteruskan ke fungsi / prosedur bukan array dinamis lagi ... Pertama saya menemukan ini , maka ada penjelasan yang sangat baik dan membingungkan .
Ini adalah struktur data terbaik yang bisa saya temukan untuk memperpendek kode. Jika Anda memiliki pilihan yang lebih baik, jangan ragu untuk memberikan saran.
sumber
Bahasa Wolfram (Mathematica) , 57 byte
Cobalah online!
Mengambil input sebagai daftar daftar yang
{a,b}
mewakili interval[a,b]
, di manaa
bisa-Infinity
danb
bisaInfinity
.Menggunakan built-in
IntervalUnion
, tapi tentu saja kita harus memijat interval ke dalam bentuk terlebih dahulu. Untuk berpura-pura bahwa intervalnya adalah bilangan bulat, kami menambahkan 1 ke batas atas (memastikan bahwa penyatuan dari[1,3]
dan[4,9]
adalah[1,9]
). Pada akhirnya, kami membatalkan operasi ini, dan mengubah hasilnya menjadi daftar daftar.Ada juga pendekatan yang sama sekali berbeda, yang menggunakan 73 byte :
Di sini, setelah menyortir interval, kami hanya mengganti dua interval berturut-turut dengan penyatuan mereka setiap kali itu akan menjadi interval tunggal, dan ulangi sampai tidak ada operasi yang tersisa untuk dilakukan.
sumber
05AB1E (legacy) ,
887978 byteInfinity adalah input sebagai huruf kecil (
'abcdefghijklmnopqrstuvwxyz'
).Cobalah secara online atau verifikasi semua kasus uji .
Catatan penting: Jika ada aktual
Infinity
dan-Infinity
, itu akan menjadi4342 byte sebagai gantinya. Jadisedikit di atas 50%sekitar 30% adalah sebagai solusi untuk kurangnyaInfinity
..Cobalah secara online (dengan
Infinity
diganti dengan9999999999
dan-Infinity
diganti dengan-9999999999
).Pasti bisa bermain golf secara substansial. Pada akhirnya itu ternyata sangat, sangat buruk, penuh dengan penyelesaian masalah. Tapi untuk saat ini saya senang bekerja.
Penjelasan:
sumber
C (dentang) ,
346342 byteCompiler bendera
-DP=printf("(%d,%d)\n"
,-DB=a[i+1]
dan-DA=a[i]
Cobalah online!
sumber
i
nilai global.while(A)i++;
seharusnyafor(i=0;A;)i++;
ditetapkan secara eksplisiti=0
sebelum menggunakannya dalam while-loop, alih-alih menggunakan0
nilai defaultnya di tingkat global. Tidak yakin lagi mengapa, tapi itu diperlukan sesuai dengan aturan meta. Terutama karena metode harus mandiri / dapat digunakan kembali, tanpa harus mereset nilai global di antara panggilan metode, IIRC.i
nilaiStax ,
4639 byteJalankan dan debug itu
Program ini mengambil input dalam notasi string yang ditentukan sebelumnya.
sumber