Generar una matriz de bucle

15

Introducción

Una matriz de punteros es una matriz Lde enteros distintos de cero donde se 0 ≤ L[i]+i < len(L)mantienen todos los índices i(suponiendo una indexación basada en 0). Decimos que el índice i apunta al índice L[i]+i. Una matriz de punteros es un bucle si los índices forman un solo ciclo de longitud len(L). Aquí hay unos ejemplos:

  • [1,2,-1,3]no es una matriz de punteros, porque 3no apunta a un índice.
  • [1,2,-1,-3]es una matriz de punteros, pero no un bucle, porque ningún índice apunta a -1.
  • [2,2,-2,-2] es una matriz de punteros, pero no un bucle, porque los índices forman dos ciclos.
  • [2,2,-1,-3] Es un bucle.

Entrada

Su entrada es una lista no vacía de enteros distintos de cero, en cualquier formato razonable. Puede estar sin clasificar y / o contener duplicados.

Salida

Su salida será un bucle que contiene todos los enteros en la lista de entrada (y posiblemente también otros enteros), contando las multiplicidades. No necesitan ocurrir en el mismo orden que en la entrada, y la salida no necesita ser mínima en ningún sentido.

Ejemplo

Para la entrada [2,-4,2], una salida aceptable sería [2,2,-1,1,-4].

Reglas y puntaje

Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten. Se agradece incluir un par de entradas y salidas de ejemplo en su respuesta.

Casos de prueba

Estos se dan en el 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]
Zgarb
fuente

Respuestas:

11

Jalea, 12 bytes

ż~Ṣ€FxA$;L$U

Pruébalo en línea!

Antecedentes

Considere el par de enteros n, ~ n , donde n ≥ 0 y ~ denota NO a nivel de bit, es decir, ~ n = - (n + 1) .

Al colocar n copias de n a la izquierda de n + 1 copias de ~ n , si comenzamos a atravesar la matriz de punteros desde el extremo derecho ~ n , atravesaremos todos los elementos 2n + 1 y nos encontraremos a la izquierda del extremo izquierdo n .

Por ejemplo, si n = 4 :

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

Para el caso especial n = 0 , el elemento n se repite 0 veces, dejando esto:

X -1
   ^
^

Para cada entero k en la entrada, podemos formar un par n, ~ n que contiene k por el ajuste de n = k si k> 0 y n = ~ k si k <0 . Esto funciona porque ~ es una involución, es decir, ~~ k = k .

Todo lo que queda por hacer es encadenar las tuplas generadas y anteponer sus longitudes combinadas, por lo que el elemento más a la izquierda nos lleva de vuelta al más a la derecha.

Ejemplos

[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]

Cómo 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.
Dennis
fuente
No necesita manejar el caso especial n = 0, porque la especificación dice " enteros distintos de cero ".
Peter Taylor el
Si bien 0 nunca ocurrirá en la entrada, todavía necesito el par 0, -1 si -1 lo hace.
Dennis