Temukan run di dalam array
Suatu run didefinisikan sebagai tiga angka atau lebih yang bertambah dari sebelumnya dengan langkah konstan. Misalnya [1,2,3] akan dijalankan dengan langkah 1, [1,3,5,7] akan dijalankan dengan langkah 2, dan [1,2,4,5] bukan lari.
Kita dapat menyatakan run ini dengan notasi "i to j by s" di mana i adalah angka pertama dari run, j adalah angka terakhir dari run, dan s adalah langkahnya. Namun, menjalankan langkah 1 akan dinyatakan "i to j".
Jadi dengan menggunakan array sebelumnya, kita mendapatkan:
[1,2,3] -> "1to3"
[1,3,5,7] -> "1to7by2"
[1,2,4,5] -> "1 2 4 5"
Dalam tantangan ini, tugas Anda adalah melakukan ini untuk array yang mungkin memiliki beberapa kali proses.
Contoh kode Python dengan rekursi:
def arr_comp_rec(a, start_index):
# Early exit and recursion end point
if start_index == len(a)-1:
return str(a[-1])
elif start_index == len(a):
return ''
# Keep track of first delta to compare while searching
first_delta = a[start_index+1] - a[start_index]
last = True
for i in range(start_index, len(a)-1):
delta = a[i+1] - a[i]
if delta != first_delta:
last = False
break
# If it ran through the for loop, we need to make sure it gets the last value
if last: i += 1
if i - start_index > 1:
# There is more than 2 numbers between the indexes
if first_delta == 1:
# We don't need by if step = 1
return "{}to{} ".format(a[start_index], a[i]) + arr_comp_rec(a, i+1)
else:
return "{}to{}by{} ".format(a[start_index], a[i], first_delta) + arr_comp_rec(a, i+1)
else:
# There is only one number we can return
return "{} ".format(a[start_index]) + arr_comp_rec(a, i)
Memasukkan
Array int positif yang diurutkan (tidak ada duplikat)
Keluaran
String yang berjalan dipisahkan oleh spasi, atau array string yang dijalankan
Tidak perlu serakah ke arah tertentu
Dapat memiliki spasi spasi tambahan
Uji Kasus
In: [1000, 1002, 1004, 1006, 1008, 1010]
Out: "1000to1010by2"
In: [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
Out: "1to3 5 8 13 21 34 55 89 144 233"
In: [10, 20, 30, 40, 60]
Out: "10to40by10 60"
In: [5, 6, 8, 11, 15, 16, 17]
Out: "5 6 8 11 15to17"
In: [1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 15, 30, 45, 50, 60, 70, 80, 90, 91, 93]
Out: "1to7 9to15by2 30 45 50to90by10 91 93"
Ini adalah kode-golf sehingga jumlah byte yang menang paling sedikit.
sumber
[4, 5, 6, 7, 9, 11, 13, 15]
tidak bisa4to6 7to15by2
?)Jawaban:
Jelly ,
4240 byte-2 terima kasih kepada Kevin Cruijssen (menyaring pasangan
ḟ2
,, daripada mengganti pasangan dengan nol,2,0y
)Program lengkap mencetak hasilnya.
(Sebagai Tautan monadik daftar yang berisi campuran bilangan bulat dan karakter akan dihasilkan)
Cobalah online!
(Terlalu tidak efisien untuk kasus uji terbesar untuk menyelesaikan dalam 60-an, jadi saya dihapus
[1,2,3,4]
.)Bagaimana?
sumber
2,0ySƲÞ
dapat di-golf hinggaḟ2SƊÞ
-2 byte.P
daripada jumlahS
dan akan membutuhkan nol.Swift, 246 byte
Cobalah online!
sumber
K (ngn / k) , 102 byte
Cobalah online!
sumber
JavaScript (ES6), 129 byte
Mengembalikan array string.
Cobalah online!
Bagaimana?
Langkah 1
Kami pertama-tama menambahkan ke setiap angka sufiks yang terdiri dari sebuah
'-'
petunjuk diikuti oleh perbedaan dengan nomor berikutnya, kecuali untuk entri terakhir yang dibiarkan tidak berubah. Array baru ini dipaksa untuk sebuah string.Contoh:
Langkah 2
Kami mengidentifikasi semua proses dalam string yang dihasilkan dan menggantinya dengan notasi yang sesuai.
Contoh:
Langkah # 3
Akhirnya, kami membagi string pada sufiks yang tersisa, termasuk koma tertinggal.
Contoh:
sumber
Ruby ,
125118 byteCobalah online!
Penjelasan
Enumerable Ruby memiliki
chunk
metode yang berguna yang melakukan persis apa yang kita butuhkan di sini - itu mengelompokkan item dengan berturut-turut berjalan dari nilai pengembalian yang sama dari blok, dalam kasus kami - perbedaan antara arus (x
) dan sebelumnya (y
).Peringatannya adalah bahwa strategi seperti itu tidak akan menangkap elemen pertama lari, misalnya di sini hanya dua elemen terakhir yang dikelompokkan bersama:
Oleh karena itu, saat memetakan ke string yang diformat dengan benar, saat kami menjumpai kemungkinan run baru (potongan dengan> 1 item), kami harus melacak jika item sebelumnya tunggal (
i=1
) atau sudah digunakan pada run lainnya (i=0
). Jika ada item tunggal yang tidak terpakai, itu menjadi titik awal proses, dan menurunkan ambang ukuran chunk dari 3 menjadi 2.sumber
R ,
180175 byteCobalah online!
Secara konsep, ini adalah port jawaban Ruby saya , walaupun secara teknis agak berbeda.
5 byte disimpan oleh JayCe.
sumber
rle
tetapi terlalu malas ... Anda dapat menghemat 1 bytesum(1|x)
di tempatlength(x)
: TIOcat
untuk 175 byte: TIOR ,
238217 byteTerima kasih @digEmAll untuk -19 byte.
Cobalah online!
sumber
F
bukannyan
seperti yang sudah diinisialisasi0
, yang seharusnya menghemat beberapa byte, saya pikir.split
,diff
danrle
. Sayangnya, pencarian serakah untuk menjalankan berarti banyak mengutak-atik.'by'[D>1]
trik yang bagus.JavaScript (Node.js) ,
177173 byteCobalah online!
sumber
Bersih ,
208... 185 byteCobalah online!
sumber
Jelly , 41 byte
Cobalah online!
Program lengkap.
sumber
Python 2 ,
170166 byteCobalah online!
sumber
Python 2 ,
138136 byte-2 byte terima kasih kepada Erik the Outgolfer .
Cobalah online!
sumber
gvm (komit 2612106 ) bytecode, 108 byte
Mengharapkan ukuran array dalam satu baris, lalu masing-masing anggota dalam satu baris.
Hexdump:
Tes berjalan:
Dirakit secara manual dari ini:
sumber
05AB1E (warisan) ,
4950 byteTerlalu lama, tapi aku sudah senang itu berhasil. Tantangan ini jauh lebih sulit daripada yang terlihat imo .. Tidak diragukan lagi bisa bermain golf lebih lanjut.
Σ€g2KO>}¤
adalah port dari2,0ySƲÞṪ
dari jawaban Jelly @ JonathanAllan (terima kasih!).Cobalah online. (CATATAN: Waktu tidak aktif untuk kasus uji besar.)
1 byte sebagai bug-fix karena
0
selalu ditempatkan pada posisi miring ketika menyortir.Penjelasan:
sumber
Perl 5 , 154 byte
Sama dengan spasi, baris baru, # komentar, dan
sub by
:Cobalah online!
... untuk lulus tes dari OP.
sumber
Retina 0.8.2 , 77 byte
Cobalah online! Tautan termasuk kasus uji. Penjelasan:
Konversikan ke unary.
Hitung perbedaan berturut-turut.
Konversi berjalan ke
to...by
sintaks.Hapus perbedaan yang belum dikonversi dan
by1
.Konversikan ke desimal.
sumber