Erzeugen Sie ein Loop-Array

15

Einführung

Ein Zeigerarray ist ein Array Lvon Ganzzahlen ungleich Null, wobei 0 ≤ L[i]+i < len(L)für alle Indizes gilt i(unter der Annahme einer 0-basierten Indizierung). Wir sagen, dass der Index auf den Index i verweistL[i]+i . Ein Zeigerarray ist eine Schleife, wenn die Indizes einen einzelnen Zyklus der Länge bilden len(L). Hier sind einige Beispiele:

  • [1,2,-1,3]ist kein Zeiger-Array, da das 3nicht auf einen Index verweist.
  • [1,2,-1,-3]ist ein Zeigerarray, aber keine Schleife, da kein Index auf das zeigt -1.
  • [2,2,-2,-2] ist ein Zeigerarray, aber keine Schleife, da die Indizes zwei Zyklen bilden.
  • [2,2,-1,-3] ist eine Schleife.

Eingang

Ihre Eingabe ist eine nicht leere Liste von Ganzzahlen ungleich Null in einem angemessenen Format. Es kann unsortiert sein und / oder Duplikate enthalten.

Ausgabe

Ihre Ausgabe soll eine Schleife sein, die alle Ganzzahlen in der Eingabeliste (und möglicherweise auch andere Ganzzahlen) enthält, wobei Multiplizitäten gezählt werden. Sie müssen nicht in derselben Reihenfolge wie die Eingabe erfolgen, und die Ausgabe muss in keiner Weise minimal sein.

Beispiel

Für die Eingabe [2,-4,2]wäre eine akzeptable Ausgabe [2,2,-1,1,-4].

Regeln und Wertung

Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig. Das Einbeziehen einiger Beispieleingaben und -ausgaben in Ihre Antwort wird geschätzt.

Testfälle

Diese sind im Format angegeben 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
quelle

Antworten:

11

Gelee, 12 Bytes

ż~Ṣ€FxA$;L$U

Probieren Sie es online!

Hintergrund

Man betrachte das Ganzzahlpaar n, ~ n , wobei n ≥ 0 und ~ bitweise NICHT bedeuten, dh ~ n = - (n + 1) .

Wenn Sie n Kopien von n links von n + 1 Kopien von ~ n platzieren und das Zeigerarray von rechts nach ~ n durchlaufen, durchlaufen Sie alle 2n + 1- Elemente und befinden sich links von n .

Zum Beispiel, wenn n = 4 :

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

Für den Sonderfall n = 0 wird das Element n selbst 0- mal wiederholt.

X -1
   ^
^

Für jede ganze Zahl k in der Eingabe können wir ein Paar n, ~ n bilden , das k enthält, indem wir n = k setzen, wenn k> 0 und n = ~ k, wenn k <0 . Dies funktioniert, weil ~ eine Involution ist, dh ~~ k = k .

Sie müssen nur die generierten Tupel verketten und ihre kombinierten Längen voranstellen, damit das ganz linke Element zum ganz rechten Element zurückführt.

Beispiele

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

Wie es funktioniert

ż~Ṣ€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
quelle
Sie müssen den Sonderfall nicht behandeln n = 0, da in der Spezifikation " Ganzzahlen ungleich Null " steht.
Peter Taylor
Während 0 niemals in der Eingabe vorkommt, brauche ich immer noch das Paar 0, -1, wenn -1 .
Dennis