Создайте циклический массив


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.