Згладжування списку


12

Ви повинні написати програму або функцію, яка приймає невід'ємне ціле число kта відсортований цілий список Lяк вхід і вихід або повертає згладжений список M.

Mстворюється із висхідного списку L, вставляючи не більше kцілих елементів, зберігаючи список відсортованим. Вставлені цілі числа слід вибирати таким чином, щоб максимальна різниця вперед Mбула якомога меншою. Ми найменуємо це найменше значення «гладкість».

Передні переліки в списку -1 3 8 11 15є, 4 5 3 4а максимальна різниця вперед 5.

З 2вставками плавність 2 10 15є, 4а можливий вихід - 2 6 10 11 15з перепадами вперед 4 4 1 4.

Вхідні дані

  • Невід’ємне ціле число k.
  • Цілий цілий список, що Lмістить щонайменше 2 елементи.

Вихідні дані

  • Цілочисельний список за зростанням M.
  • Якщо існує декілька правильних відповідей, виведіть саме один із них (достатньо будь-якого).
  • Ваше рішення має вирішити будь-який приклад тестового випадку за хвилину на моєму комп’ютері (я перевіряю лише тісні випадки. У мене ПК нижче середнього рівня).

Приклади

Введення ( k, L) => Можливий вихід та максимальна різниця вперед (що не є частиною виводу) у дужках

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)

Це код-гольф, тому найкоротший запис виграє.

Відповіді:


5

Pyth, 28 27 байт

S+Qu?smt%hHrFdC,QtQ>GvzGhvz

Введені дані:

3
[2, 10, 15]

Демонстрація. Тестовий джгут.

Примітка. У той час, коли було задано питання, в Pyth з’явилася невелика помилка, пов’язана з використанням rFdвсередині u, яку я щойно виправив. Помилка зробила неможливим ніколи не використовувати Fвсередині u, чого точно не було призначено.

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.

Ось версія, яка працювала б з перекладачем на той момент, коли було поставлено запитання. Це 28 байт, і працює точно так само:

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

Демонстрація.

Git commit відповідної версії, f6b40e62


Я ніколи не думав використовувати, rF<seq>щоб розпакувати двоелементні кортежі.
orlp

@orlp Це чудовий трюк, і я використовував його ще в той час, коли uпрацювали інакше і eне існував, urGHdбув коротшим, ніж rhd@d1. Я розміщу це на сторінці трюків Pyth.
isaacg

Ви можете поголити персонажа, вам це не потрібно U.
orlp

@orlp Дякую Насправді, yvzне вдається коли vz = 0, але hvzробить трюк.
isaacg

Оскільки код не працюватиме з версією Pyth, яка була доступна, коли було задано питання, я вирішив не приймати це рішення. Якщо ви дасте відповідь, яка не покладається на помилку, напишіть мені, і я прийму її.
randomra

8

Пітон 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)

Пробує різні максимальні кроки d, починаючи з 1 і підраховуючи. Заповнює прогалини кожної пари (p,x)послідовних елементів, приймаючи кожне d'число у проміжку. Якщо Mдовше, ніж дозволяє квота, повторюється спробувати вищу d. В іншому випадку повертає список доданих та оригінальних елементів, відсортованих.

Це робить усі тестові випадки без зволікань на моїй машині.


Ви спробували щось на зразок 1, 1000000000?
edc65

@ edc65 Це алгоритм знадобився б дуже довго, але я пробігаю глибину стека до цього.
xnor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.