整理清单


12

您应该编写一个程序或函数,该程序或函数将非负整数k和排序后的整数列表L作为输入,并输出或返回平滑列表M

ML通过在k保持列表排序的同时最多插入整数元素来从升序列表创建。插入的整数应该以最大前向差异M尽可能小的方式选择。我们将这个最小值称为“平滑度”。

该列表的正向差异-1 3 8 11 154 5 3 4与最大正向差别5

通过2插入,2 10 15is 的平滑度4和可能的输出存在2 6 10 11 15正向差异4 4 1 4

输入值

  • 一个非负整数k
  • L包含至少2个元素的升序整数列表。

输出量

  • 升序整数列表M
  • 如果存在多个正确答案,则输出恰好其中一个(任何一个都足够)。
  • 您的解决方案必须在一分钟之内在我的计算机上解决任何示例测试用例(我将仅测试关闭的用例。我的PC低于平均水平。)。

例子

输入(kL)=>可能的输出以及括号中的最大前向差(不属于输出)

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)

这是代码高尔夫球,因此最短的条目将获胜。

Answers:


5

Pyth,28 27字节

S+Qu?smt%hHrFdC,QtQ>GvzGhvz

输入如下:

3
[2, 10, 15]

示范。 测试线束。

注意:在提出问题时,Pyth中有一个小错误,涉及到使用rFdinside u,我刚刚修复了它。该错误使它无法在Finside中使用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 2015年

@orlp这是一个伟大的把戏,当我用它的方式早在一天u的工作不同,e根本不存在,urGHd是比较短的rhd@d1。我将其放在“ Pyth技巧”页面上。
isaacg 2015年

您可以刮掉一个字符,不需要U
orlp 2015年

@orlp谢谢。实际上,yvz在时失败vz = 0,但是hvz可以解决问题。
isaacg 2015年

由于该代码不适用于提出问题时可用的Pyth版本,因此我选择不接受此解决方案。如果您给出的答案不依赖于错误修正,请ping我,我会接受的。
randomra'5

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 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.