リストを滑らかにする


12

入力として負でない整数kとソート済み整数リストを取りL、平滑化リストを出力または返すプログラムまたは関数を作成する必要がありますM

MリストをソートしたままL最大でk整数要素を挿入することにより、昇順リストから作成されます。挿入される整数は、最大の前方差分がMできるだけ小さくなるように選択する必要があります。この最小値を「滑らかさ」と呼びます。

リストの前方差分-1 3 8 11 15はで4 5 3 4あり、最大前方差分は5です。

2挿入の滑らかさ2 10 15、IS 4との可能な出力があり2 6 10 11 15、前方の違いで4 4 1 4

入力

  • 負でない整数k
  • L少なくとも2つの要素を持つ昇順の整数リスト。

出力

  • 昇順の整数リストM
  • 複数の正解が存在する場合は、そのうちの1つだけを出力します(いずれか1つで十分です)。
  • あなたの解決策は、私のコンピューターで1分以内すべてのサンプルテストケースを解決する必要があります(近くのケースのみをテストします。平均以下の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)

これはコードゴルフなので、最短のエントリーが勝ちます。

回答:


5

Pyth、28 27バイト

S+Qu?smt%hHrFdC,QtQ>GvzGhvz

次のような入力

3
[2, 10, 15]

デモンストレーション。 テストハーネス。

注:質問が行われた時点で、rFdinsideの使用に関連するPythに小さなバグがありましたが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

デモンストレーション。

適切なバージョンf6b40e62のGitコミット


rF<seq>2要素のタプルをアンパックするために使用することを考えたことがありません。
orlp

@orlpこれは素晴らしいトリックです。以前ueは違った方法で動作し、存在しなかった、以前urGHdよりも短いものを使用していましたrhd@d1。Pythのトリックページに掲載します。
isaacg

あなたはキャラクターを剃ることができます、あなたは必要ありませんU
orlp

@orlpありがとう。実際には、yvzとき失敗したvz = 0が、hvzトリックを行います。
isaacg

質問が尋ねられたときに利用可能であったPythバージョンではコードが機能しないため、この解決策を受け入れないことにしました。バグ修正に依存しない回答を提供していただいた場合は、pingを送信してください。受け入れます。
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)

d1から開始して、異なる最大増分を試行します。ギャップ内の(p,x)すべてdの数値を取得することにより、連続する要素の各ペアのギャップを埋めます。Mクォータが許可するよりも長い場合は、より高いを試すために再帰しdます。それ以外の場合、追加および元の要素のリストをソートして返します。

これにより、すべてのテストケースが私のマシンで遅延なく実行されます。


1、1000000000のようなものを試しましたか?
edc65

@ edc65このアルゴリズムには本当に長い時間がかかりますが、その前にスタック深度を実行します。
xnor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.