Diberikan daftar bilangan bulat unik dan positif yang tidak disortir, mengeluarkan daftar terpendek dari kisaran terpanjang yang mungkin dari bilangan bulat berurutan.
MEMASUKKAN
- Daftar bilangan bulat unik dan positif yang tidak disortir
- misalnya
9 13 3 11 8 4 10 15
- misalnya
- Masukan dapat diambil dari salah satu dari berikut ini:
stdin
- argumen baris perintah
- argumen fungsi
KELUARAN
- Daftar rentang atau nilai individual yang dicetak pada satu baris untuk stdout atau keluaran serupa bahasa Anda yang terdekat.
- Jika dua atau lebih bilangan bulat berurutan (berurutan menurut nilai, bukan berdasarkan lokasi dalam daftar) hadir, mereka akan dilambangkan sebagai rentang inklusif menggunakan -, misalnya
8-11
- Semua bilangan bulat lainnya hanya dicetak tanpa notasi lain
- Satu ruang akan membatasi output
- Jika dua atau lebih bilangan bulat berurutan (berurutan menurut nilai, bukan berdasarkan lokasi dalam daftar) hadir, mereka akan dilambangkan sebagai rentang inklusif menggunakan -, misalnya
- Angka yang tidak ada dalam input tidak boleh dalam output, mis.
3 5 6
Tidak dapat disingkat menjadi3-6
karena4
tidak ada
CONTOH
Berhasil:
IN> 9 13 3 11 8 4 10 15 6
OUT> 3-4 6 8-11 13 15
IN> 11 10 6 9 13 8 3 4 15
OUT> 3-4 6 8-11 13 15
IN> 5 8 3 2 6 4 7 1
OUT> 1-8
IN> 5 3 7 1 9
OUT> 1 3 5 7 9
Salah:
IN> 9 13 3 11 8 4 10 15
OUT> 3-15
Rentang berisi nilai yang tidak ada dalam input
IN> 9 13 3 11 8 4 10 15
OUT> 3 4 8 9 10 11 13 15
Semua nilai sekuensial harus direpresentasikan sebagai rentang
IN> 9 13 3 11 8 4 10 15
OUT> 3-4 8-9 10-11 13 15
Rentang yang dibagi , 8-9
dan 10-11
harus8-11
IN> 9 13 3 11 8 4 10 15
OUT> 8-9 13 10-11 3-4 15
Output tidak dipesan dengan benar
ATURAN
- Celah standar tidak diijinkan
- Jika bahasa Anda memiliki fungsi untuk melakukan ini, itu tidak diperbolehkan
- Anda dapat menulis program lengkap, atau suatu fungsi
- trailing whitespace tidak masalah
SKOR
- Paling tidak byte menang
Jawaban:
Python 2,
123120 byteJika input dapat berupa daftar sebagai argumen fungsi, maka (terima kasih mbomb007 dan xnor untuk kondisional)
939081 byte(77 byte jika memimpin spasi dapat diterima - jatuhkan final
[1:]
)sumber
str(n)
ke`n`
untuk menyimpan beberapa byte, jika Anda beralih ke Python 2.raw_input()
, dan Anda dapat mengubah'-'+`n`
ke`-n`
. Dan karena Anda sekarang menggunakan Python 2, Anda dapat menghapus tanda kurung setelahprint
.def f(N):print''.join([' '+`n`,`-n`*(n+1 not in N)][n-1 in N]for n in sorted(N))[1:]
(yang dapat di-golf lebih lanjut).set(N)
bukannyasorted(N)
; ini dengan benar akan beralih dari terkecil ke terendah saat menggunakan cPython tetapi tidak dijamin untuk semua implementasi sehingga ada beberapa pertanyaan tentang apakah ini valid atau tidak.JavaScript (ES6):
171154140137byteTerima kasih edc65 dan vihan1086 untuk tipsnya!
tetapi tidak berfungsi dalam kasus ini karena angka multi-digit.[...n]
sangat bagusVarian ES5,
198184183174 byteTampilkan cuplikan kode
sumber
[...n]
lebih baikRuby,
8684 byteIni adalah versi yang sedikit golf dari contoh dalam dokumen untuk slice_when .
sumber
CJam, 35 byte
Cobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
Ruby, 70 byte
Masalah seperti ini cenderung membuat saya memeriksa API Ruby untuk metode yang sesuai, dan hari ini saya menemukan metode baru
Array#slice_when
:, baru diperkenalkan di Ruby v2.2 dan sepertinya ditujukan untuk situasi yang tepat ini :)Setelah mengurutkan dan mengiris array dengan tepat, dibutuhkan setiap sub-array dan membuat string dari elemen tertinggi dan terendah, dan kemudian menggabungkan seluruh array ini ke dalam sebuah string.
Contoh:
f.call [9,13,3,11,8,4,10,15,6]
cetakan3-4 6 8-11 13 15
sumber
SWI-Prolog,
165162159 byteCukup buruk tapi sekali lagi Prolog adalah bahasa golf yang mengerikan
Contoh:
a([9,13,3,11,8,4,10,15,6]).
keluaran3-4 6 8-11 13 15
sumber
CJam,
3833 byteVersi baru, menggunakan ide dan fragmen kode yang disarankan oleh @Dennis:
Cobalah online
Format input adalah array CJam dalam tanda kurung siku.
Ide dasar di sini adalah bahwa saya mengurangi urutan monoton dari urutan input yang diurutkan terlebih dahulu:
Dalam perbedaan ini, nilai yang merupakan bagian dari interval yang sama memiliki nilai yang sama. Menerapkan operator CJam RLE ke perbedaan ini secara langsung menyebutkan interval.
Nilai sekuensial yang dikurangi perlu ditambahkan kembali selama output. Saya tidak sepenuhnya senang dengan bagaimana hal itu dilakukan dalam kode saya. Saya menduga bahwa saya dapat menyimpan beberapa byte dengan cara yang lebih elegan untuk menyerahkannya.
Untuk menghasilkan output dari interval, ini menggunakan ide Dennis 'menghasilkan angka negatif untuk nilai akhir, yang mengurus memproduksi
-
, dan juga menyederhanakan logika karena hanya satu nilai yang perlu ditambahkan / dihilangkan tergantung pada ukuran interval .Penjelasan:
sumber
l~$_,,.-e`{~T+\_T+:T;,f+(\W>Wf*S}/
-
output tanpa muncul di kode, dan tanpa syarat. Sekarang saya mengerti: Itu berasal dari mengubah nilai akhir menjadi angka negatif! Saya tidak akan pernah menghasilkan ini, jadi saya akan merasa buruk karena menyalinnya. Saya akan mencoba belajar darinya untuk waktu berikutnya! :)l~$_,,.-e
{~ T + _T +: T; (_ 2 $ + W * Q? S} / `? Namun, itu jauh lebih mirip dengan kode Anda sendiri dan beratnya hanya 33 byte.CoffeeScript,
178161 byteSama seperti jawaban JavaScript saya. Saya perlu mencari tahu apakah menggunakan pemahaman akan menghasilkan kode yang lebih pendek.
Asli:
sumber
Python 2,
126122121 byteSaya tahu ini bisa menjadi lebih pendek, hanya saja tidak tahu di mana .. Membutuhkan input dalam bentuk
[#, #, #, #, ..., #]
.sumber
exec
cukup sering.while x<len(l)
denganwhile l[x:]
untuk menyimpan beberapa byte.Java, 191 byte
Memeriksa rentang dan mencetaknya sesuai. Sayangnya saya harus membuat kasus khusus untuk elemen terakhir dalam array karena program akan berakhir tanpa mencetak angka atau rentang terakhir.
sumber
Java,
171162 byteMengambil input sebagai array int, mengembalikan output sebagai daftar String yang dipisahkan oleh ruang
sumber