Wygeneruj tablicę zapętloną

15

Wprowadzenie

Tablica wskaźników to tablica Lniezerowych liczb całkowitych, w których obowiązuje 0 ≤ L[i]+i < len(L)dla wszystkich indeksów i(przy założeniu indeksowania 0). Mówimy, że indeks i wskazuje na indeks L[i]+i. Tablica wskaźników jest pętlą, jeśli indeksy tworzą pojedynczy cykl długości len(L). Oto kilka przykładów:

  • [1,2,-1,3]nie jest tablicą wskaźników, ponieważ 3nie wskazuje na indeks.
  • [1,2,-1,-3]jest tablicą wskaźników, ale nie pętlą, ponieważ żaden indeks nie wskazuje na -1.
  • [2,2,-2,-2] jest tablicą wskaźników, ale nie pętlą, ponieważ indeksy tworzą dwa cykle.
  • [2,2,-1,-3] jest pętlą.

Wejście

Twoje dane wejściowe to niepusta lista niezerowych liczb całkowitych, w dowolnym rozsądnym formacie. Może być nieposortowane i / lub zawierać duplikaty.

Wynik

Twoje wyjście powinno być pętlą, która zawiera wszystkie liczby całkowite na liście danych wejściowych (i ewentualnie także inne liczby całkowite), zliczając wielokrotności. Nie muszą występować w tej samej kolejności co na wejściu, a wynik nie musi być w żadnym sensie minimalny.

Przykład

Dla danych wejściowych [2,-4,2] akceptowalny wynik to [2,2,-1,1,-4].

Zasady i punktacja

Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów i standardowe luki są niedozwolone. Doceniane jest uwzględnienie w odpowiedzi kilku przykładowych danych wejściowych i wyjściowych.

Przypadki testowe

Są one podane w formacie 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
źródło

Odpowiedzi:

11

Galaretka, 12 bajtów

ż~Ṣ€FxA$;L$U

Wypróbuj online!

tło

Rozważ parę liczb całkowitych n, ~ n , gdzie n ≥ 0 i ~ oznacza bitowe NIE, tj. ~ N = - (n + 1) .

Umieszczając n kopii n na lewo od n + 1 kopii ~ n , jeśli zaczniemy przemierzać tablicę wskaźników od skrajnej prawej ~ n , przejdziemy przez wszystkie elementy 2n + 1 i znajdziemy się na lewo od lewej skrajnej n .

Na przykład, jeśli n = 4 :

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

W przypadku specjalnym n = 0 sam element n jest powtarzany 0 razy, pozostawiając to:

X -1
   ^
^

Dla każdej liczby całkowitej k na wejściu możemy utworzyć parę n, ~ n, która zawiera k , ustawiając n = k, jeśli k> 0 i n = ~ k, jeśli k <0 . Działa to, ponieważ ~ jest inwolucją, tj. ~~ k = k .

Wszystko, co pozostało do zrobienia, to połączyć wygenerowane krotki i przygotować ich połączone długości, więc element znajdujący się najbardziej po lewej stronie prowadzi nas z powrotem do skrajnego prawego.

Przykłady

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

Jak to działa

ż~Ṣ€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
źródło
Nie musisz zajmować się przypadkiem specjalnym n = 0, ponieważ specyfikacja mówi „ niezerowe liczby całkowite ”.
Peter Taylor,
Podczas gdy 0 nigdy nie pojawi się na wejściu, nadal potrzebuję pary 0, -1, jeśli -1 .
Dennis,