Gere uma matriz de loop


15

Introdução

Uma matriz de ponteiro é uma matriz Lde números inteiros diferentes de zero, onde 0 ≤ L[i]+i < len(L)é válida para todos os índices i(assumindo a indexação baseada em 0). Dizemos que o índice i aponta para o índice L[i]+i. Uma matriz de ponteiros é um loop se os índices formarem um único ciclo de duração len(L). aqui estão alguns exemplos:

  • [1,2,-1,3]não é uma matriz de ponteiro, porque 3não aponta para um índice.
  • [1,2,-1,-3]é uma matriz de ponteiro, mas não um loop, porque nenhum índice aponta para o -1.
  • [2,2,-2,-2] é uma matriz de ponteiros, mas não um loop, porque os índices formam dois ciclos.
  • [2,2,-1,-3] é um loop.

Entrada

Sua entrada é uma lista não vazia de números inteiros diferentes de zero, em qualquer formato razoável. Pode ser não classificado e / ou conter duplicatas.

Resultado

Sua saída deve ser um loop que contém todos os números inteiros na lista de entradas (e possivelmente outros números inteiros também), contando as multiplicidades. Eles não precisam ocorrer na mesma ordem que na entrada e a saída não precisa ser mínima em nenhum sentido.

Exemplo

Para a entrada [2,-4,2], uma saída aceitável seria [2,2,-1,1,-4].

Regras e pontuação

Você pode escrever um programa completo ou uma função. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas. A inclusão de alguns exemplos de entradas e saídas em sua resposta é apreciada.

Casos de teste

Estes são dados no formato input -> some possible output(s).

[1] -> [1,-1] or [1,1,1,-3]
[2] -> [2,-1,-1] or [1,2,-2,-1]
[-2] -> [1,1,-2] or [3,1,2,-2,-4]
[2,-2] -> [2,-1,1,-2] or [2,-1,2,-2,-1]
[2,2,2] -> [2,-1,2,-2,2,-2,-1] or [2,2,2,2,-3,-5]
[2,-4,2] -> [2,2,-1,1,-4] or [2,5,1,1,1,-4,2,-7,-1]
[3,-1,2,-2,-1,-5] -> [2,3,-1,2,-1,-5] or [3,3,-1,-1,2,2,-1,6,1,1,1,1,-12,-5]
[-2,-2,10,-2,-2,-2] -> [10,-1,1,-2,-2,1,-2,-2,1,-2,-2]
[-15,15,-15] -> [15,-1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,-15,-15]
[1,2,3,4,5] -> [1,2,3,-1,4,-1,5,-1,-1,-9,-1,-1]

Respostas:


11

Gelatina, 12 bytes

ż~Ṣ€FxA$;L$U

Experimente online!

fundo

Considere o par de números inteiros n, ~ n , onde n ≥ 0 e ~ denota bit a bit NOT, ou seja, ~ n = - (n + 1) .

Colocando n cópias de n à esquerda de n + 1 cópias de ~ n , se começarmos a percorrer a matriz de ponteiros da direita ~ n , atravessaremos todos os elementos 2n + 1 e nos encontraremos à esquerda da esquerda n .

Por exemplo, se n = 4 :

X  4  4  4  4  -5 -5 -5 -5 -5
                            ^
            ^
                         ^
         ^
                      ^
      ^
                   ^
   ^
                ^
^

Para o caso especial n = 0 , o próprio elemento n é repetido 0 vezes, deixando isso:

X -1
   ^
^

Para cada número inteiro k na entrada, podemos formar um par n, ~ n que contém k , configurando n = k se k> 0 e n = ~ k se k <0 . Isso funciona porque ~ é uma involução, ou seja, ~~ k = k .

Tudo o que resta a fazer é encadear as tuplas geradas e preceder seus comprimentos combinados, para que o elemento mais à esquerda nos leve de volta ao mais à direita.

Exemplos

[1] -> [3, 1, -2, -2]
[2] -> [5, 2, 2, -3, -3, -3]
[-2] -> [3, 1, -2, -2]
[2, -2] -> [8, 1, -2, -2, 2, 2, -3, -3, -3]
[2, 2, 2] -> [15, 2, 2, -3, -3, -3, 2, 2, -3, -3, -3, 2, 2, -3, -3, -3]
[2, -4, 2] -> [17, 2, 2, -3, -3, -3, 3, 3, 3, -4, -4, -4, -4, 2, 2, -3, -3, -3]
[3, -1, 2, -2, -1, -5] -> [26, 4, 4, 4, 4, -5, -5, -5, -5, -5, -1, 1, -2, -2, 2, 2, -3, -3, -3, -1, 3, 3, 3, -4, -4, -4, -4]
[-2, -2, 10, -2, -2, -2] -> [36, 1, -2, -2, 1, -2, -2, 1, -2, -2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, 1, -2, -2, 1, -2, -2]
[-15, 15, -15] -> [89, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15]
[1, 2, 3, 4, 5] -> [35, 5, 5, 5, 5, 5, -6, -6, -6, -6, -6, -6, 4, 4, 4, 4, -5, -5, -5, -5, -5, 3, 3, 3, -4, -4, -4, -4, 2, 2, -3, -3, -3, 1, -2, -2]

Como funciona

ż~Ṣ€FxA$;L$U  Main link. Argument: A (list of integers)

 ~            Yield the bitwise not of each k in A.
ż             Zipwith; pair each k in A with ~k.
  Ṣ€          Sort each pair, yielding [~n, n] with n ≥ 0.
    F         Flatten the list of pairs.
       $      Combine the previous two links into a monadic chain:
      A         Yield the absolute values of all integers in the list.
                |n| = n and |~n| = |-(n + 1)| = n + 1
     x          Repeat each integer m a total of |m| times.
          $   Combine the previous two links into a monadic chain:
         L      Yield the length of the generated list.
        ;       Append the length to the list.
           U  Upend; reverse the generated list.

Você não precisa lidar com o caso especial n = 0, porque a especificação diz " números inteiros diferentes de zero ".
Peter Taylor

Embora 0 nunca ocorra na entrada, ainda preciso do par 0, -1 se -1 ocorrer .
Dennis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.