Suavizando uma lista

12

Você deve escrever um programa ou função que use um número inteiro não negativo ke uma lista inteira classificada Lcomo entrada e saída ou retorne uma lista suavizada M.

Mé criado a partir da lista crescente L, inserindo no máximo kelementos inteiros, mantendo a lista classificada. Os números inteiros inseridos devem ser escolhidos de maneira que a diferença máxima de avanço Mseja a menor possível. Vamos chamar esse valor menor de "suavidade".

As diferenças diretas da lista -1 3 8 11 15são 4 5 3 4e a diferença máxima direta é 5.

Com 2inserções, a suavidade de 2 10 15é 4e uma saída possível é 2 6 10 11 15com diferenças diretas 4 4 1 4.

Entrada

  • Um número inteiro não negativo k.
  • Uma lista inteira ascendente Lcom pelo menos 2 elementos.

Resultado

  • A lista inteira ascendente M.
  • Se existirem várias respostas corretas, produza exatamente uma delas (qualquer uma é suficiente).
  • Sua solução precisa resolver qualquer exemplo de caso de teste em menos de um minuto no meu computador (apenas testarei casos encerrados. Tenho um PC abaixo da média.).

Exemplos

Entrada ( k, L) => Uma saída possível e a diferença máxima direta (que não faz parte da saída) entre parênteses

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)

Isso é código-golfe, portanto a entrada mais curta vence.

randomra
fonte

Respostas:

5

Pitão, 28 27 bytes

S+Qu?smt%hHrFdC,QtQ>GvzGhvz

Entrada fornecida como:

3
[2, 10, 15]

Demonstração. Equipamento de teste.

Nota: No momento em que a pergunta foi feita, havia um pequeno bug no Pyth relacionado ao uso rFdinterno u, que eu corrigi . O bug impossibilitou o uso Finterno u, o que definitivamente não foi planejado.

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.

Aqui está uma versão que teria funcionado com o intérprete no momento em que a pergunta foi feita. São 28 bytes e funcionam exatamente da mesma maneira:

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

Demonstração.

Confirmação Git da versão apropriada, f6b40e62

isaacg
fonte
Eu nunca pensei em usar rF<seq>para descompactar tuplas de dois elementos.
orlp
@orlp É um grande truque, e eu o usei no tempo em que ufuncionava de maneira diferente e enão existia, urGHdera mais curto do que rhd@d1. Vou colocá-lo na página de truques do Pyth.
Isaacg
Você pode raspar um personagem, não precisa do U.
orlp
@orlp Obrigado. Na verdade, yvzfalha quando vz = 0, mas hvzfaz o truque.
Isaacg
Como o código não funcionava com a versão Pyth, disponível quando a pergunta foi feita, optei por não aceitar esta solução. Se você der uma resposta que não depende da correção de bugs, faça ping e eu a aceitarei.
Aleatório #
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)

Tenta diferentes incrementos máximos d, começando em 1 e contando. Preenche as lacunas de cada par (p,x)de elementos sucessivos, dpreenchendo todos os números do intervalo. Se Mfor maior que a cota permitida, é recomendável tentar um valor mais alto d. Caso contrário, retorna uma lista dos elementos adicionados e originais, classificados.

Isso faz todos os casos de teste sem demora na minha máquina.

xnor
fonte
Você tentou algo como 1, 1000000000?
Edc65
@ edc65 Isso levaria esse algoritmo muito, muito longo, mas eu corri da profundidade da pilha muito antes disso.
Xnor