Створити циклічний масив


15

Вступ

Масив покажчиків являє собою масив Lненульових цілих чисел , де 0 ≤ L[i]+i < len(L)має місце для всіх індексів i(передбачається , що індексація з 0). Ми кажемо, що індекс i вказує на індекс L[i]+i. Масив вказівника - це цикл, якщо індекси утворюють один цикл довжини len(L). Ось кілька прикладів:

  • [1,2,-1,3]не є вказівним масивом, оскільки 3значення не вказує на індекс.
  • [1,2,-1,-3]- це масив вказівника, але не цикл, тому що жоден індекс не вказує на -1.
  • [2,2,-2,-2] є масивом вказівника, але не циклом, тому що індекси утворюють два цикли.
  • [2,2,-1,-3] - це петля.

Вхідні дані

Ваш вхід - це порожній список ненульових цілих чисел, у будь-якому розумному форматі. Він може бути несортованим та / або містити дублікати.

Вихідні дані

Ваш вихід повинен бути циклом, який містить усі цілі числа у списку вхідних даних (і, можливо, інші цілі числа), рахуючи кратність. Вони не повинні відбуватися в тому ж порядку, що і у вводі, і вихід не повинен бути мінімальним у будь-якому сенсі.

Приклад

Для введення [2,-4,2]прийнятним буде вихід [2,2,-1,1,-4].

Правила та оцінка

Ви можете написати повну програму або функцію. Виграє найменший байт, а стандартні лазівки заборонені. Включення в вашу відповідь пару прикладних входів та результатів.

Тестові справи

Вони наведені у форматі 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]

Відповіді:


11

Желе, 12 байт

ż~Ṣ€FxA$;L$U

Спробуйте в Інтернеті!

Фон

Розглянемо пару цілих чисел n, ~ n , де n ≥ 0 і ~ позначає порозрядно НЕ, тобто ~ n = - (n + 1) .

Розмістивши n копій n ліворуч від n + 1 копій ~ n , якщо ми почнемо обходити масив вказівників з правого краю ~ n , ми пройдемо всі 2n + 1 елементи і опинимося зліва від крайнього лівого n .

Наприклад, якщо n = 4 :

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

Для особливого випадку n = 0 сам елемент n повторюється 0 разів, залишаючи це:

X -1
   ^
^

Для кожного цілого k на вході ми можемо сформувати пару n, ~ n, яка містить k , встановивши n = k, якщо k> 0 і n = ~ k, якщо k <0 . Це працює, тому що ~ є інволюцією, тобто ~~ k = k .

Залишилося лише зв'язати згенеровані кортежі і додати їх комбіновані довжини, тому крайній лівий елемент поверне нас до правого правого.

Приклади

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

Як це працює

ż~Ṣ€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.

Вам не потрібно обробляти особливий випадок n = 0, оскільки специфікація говорить " ненульові цілі числа ".
Пітер Тейлор

Хоча 0 ніколи не відбудеться на вході, мені все одно потрібна пара 0, -1 якщо -1 .
Денніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.