Menghaluskan daftar

12

Anda harus menulis sebuah program atau fungsi yang mengambil bilangan bulat non-negatif kdan daftar bilangan bulat yang diurutkan Lsebagai input dan output atau mengembalikan daftar yang dihaluskan M.

Mdibuat dari daftar naik Ldengan memasukkan paling banyak kelemen integer sambil menjaga daftar diurutkan. Bilangan bulat yang dimasukkan harus dipilih sedemikian rupa sehingga perbedaan maju maksimum Makan sekecil mungkin. Kami akan menyebut nilai terkecil ini sebagai "kehalusan".

Perbedaan maju daftar -1 3 8 11 15adalah 4 5 3 4dan perbedaan maju maksimum adalah 5.

Dengan 2insersi, kelancaran 2 10 15is 4dan kemungkinan output 2 6 10 11 15dengan perbedaan forward 4 4 1 4.

Memasukkan

  • Bilangan bulat non-negatif k.
  • Daftar bilangan bulat naik Ldengan setidaknya 2 elemen.

Keluaran

  • Daftar bilangan bulat naik M.
  • Jika ada beberapa jawaban yang benar, keluarkan salah satu dari mereka (ada yang mencukupi).
  • Solusi Anda harus menyelesaikan contoh uji kasus di bawah satu menit di komputer saya (saya hanya akan menguji kasus tutup. Saya memiliki PC di bawah rata-rata.).

Contohnya

Input ( k, L) => Output yang mungkin dan selisih maju maksimum (yang bukan merupakan bagian dari output) dalam tanda kurung

0, 10 20 => 10 20 (10)

2, 1 10 => 1 4 7 10 (3)

2, 2 10 15 => 2 6 10 11 15 (4)

3, 2 10 15 => 2 5 8 10 12 15 (3)

5, 1 21 46 => 1 8 15 21 27 33 39 46 (7)

5, 10 20 25 33 => 10 14 18 20 24 25 29 33 (4)

3, 4 4 6 9 11 11 15 16 25 28 36 37 51 61 => 4 4 6 9 11 11 15 16 22 25 28 36 37 45 51 59 61 (8)

15, 156 888 2015 => 156 269 382 495 608 721 834 888 1001 1114 1227 1340 1453 1566 1679 1792 1905 2015 (113)

8, -399 -35 -13 56 157 => -399 -347 -295 -243 -191 -139 -87 -35 -13 39 56 108 157 (52)

5, 3 3 3 => 3 3 3 3 (0)

Ini adalah kode-golf sehingga entri terpendek menang.

randomra
sumber

Jawaban:

5

Pyth, 28 27 byte

S+Qu?smt%hHrFdC,QtQ>GvzGhvz

Masukan yang diberikan seperti:

3
[2, 10, 15]

Demonstrasi. Uji harness.

Catatan: Pada saat pertanyaan diajukan, ada bug kecil di Pyth terkait dengan penggunaan rFddi dalam u, yang baru saja saya perbaiki. Bug membuatnya tidak mungkin untuk digunakan Fdi dalam u, yang jelas tidak dimaksudkan.

S+Qu?smt%hHrFdC,QtQ>GvzGhvz

                               Implicit:
                               z is the number of insertions, in string form.
                               Q is the input list.
              C,QtQ            Pairs of elements, e.g. [(2, 10), (10, 15)]
           rFd                 d = (a, b) -> range(a, b)
        %hH                    Take every H+1th element of that range
       t                       And throw out the first one.
      m                        Perform this process for each element pair
     s                         And combine the results into one list.

                               The above is a minimal set of additional elements
                               To reduce the maximal difference to H+1.

  u                     hvz    Repeat until the result stops changing, where
                               the prior result is G, H starts at 0 and
                               increases by 1 each repetition, and
                               G is initialized to eval(z)+1.
   ?               >GvzG       If not G[eval(z):], return G. In other words,
                               if the prior result was short enough, stop.
                               Also, this is always false on the initial call.
    smt%hHrFdC,QtQ             Otherwise, recalculate with H incremented.
S+Q                            Take the result, add the original list, and sort.

Berikut ini adalah versi yang akan bekerja dengan penerjemah pada saat pertanyaan diajukan. Ini 28 byte, dan bekerja dengan cara yang persis sama:

S+Qu?smt%hHr.udC,QtQ>GvzGhvz

Demonstrasi.

Git commit dari versi yang sesuai, f6b40e62

isaacg
sumber
Saya tidak pernah berpikir untuk menggunakan rF<seq>membongkar tupel dua elemen.
orlp
@ Atlp Ini adalah trik yang hebat, dan saya telah menggunakannya pada hari ketika ubekerja secara berbeda dan etidak ada, urGHdlebih pendek dari itu rhd@d1. Saya akan meletakkannya di halaman trik Pyth.
isaacg
Anda dapat mengurangi karakter, Anda tidak perlu U.
orlp
@ orlp Terima kasih. Sebenarnya, yvzgagal kapan vz = 0, tetapi hvzmelakukan trik.
isaacg
Karena kode tidak akan berfungsi dengan versi Pyth yang tersedia ketika pertanyaan diajukan, saya memilih untuk tidak menerima solusi ini. Jika Anda memberikan jawaban yang tidak bergantung pada perbaikan bug, ping saya dan saya akan menerimanya.
randomra
8

Python 2, 104

def f(L,k,d=1):
 M=[];p=L[0]
 for x in L:M+=range(p+d,x,d);p=x
 return M[k:]and f(L,k,d+1)or sorted(L+M)

Mencoba peningkatan maksimum yang berbeda d, mulai dari 1 dan menghitung. Mengisi celah masing-masing pasangan (p,x)elemen berturut-turut dengan mengambil dangka ke-5 dalam celah tersebut. Jika Mlebih lama dari kuota memungkinkan, berulang untuk mencoba yang lebih tinggi d. Jika tidak, mengembalikan daftar elemen yang ditambahkan dan asli, diurutkan.

Ini melakukan semua kasus uji tanpa penundaan pada mesin saya.

Tidak
sumber
Apakah Anda mencoba sesuatu seperti 1, 1000000000?
edc65
@ edc65 Itu akan membutuhkan algoritma ini sangat, sangat lama, tapi saya jalankan dengan cara stack depth sebelum itu.
xnor