Hasilkan array perulangan

15

pengantar

Sebuah Array pointer adalah array Ldari nol bilangan bulat mana 0 ≤ L[i]+i < len(L)berlaku untuk semua indeks i(dengan asumsi pengindeksan 0-based). Kami mengatakan bahwa indeks i menunjuk ke indeks L[i]+i. Array penunjuk adalah lingkaran jika indeks membentuk satu siklus panjang len(L). Berikut ini beberapa contohnya:

  • [1,2,-1,3]bukan array pointer, karena 3tidak menunjuk ke indeks.
  • [1,2,-1,-3]adalah array pointer, tetapi bukan loop, karena tidak ada indeks yang menunjuk ke -1.
  • [2,2,-2,-2] adalah array pointer, tetapi bukan loop, karena indeks membentuk dua siklus.
  • [2,2,-1,-3] adalah sebuah loop.

Memasukkan

Input Anda adalah daftar bilangan bulat bukan-kosong yang kosong, dalam format apa pun yang masuk akal. Mungkin tidak disortir dan / atau mengandung duplikat.

Keluaran

Output Anda akan menjadi sebuah loop yang berisi semua bilangan bulat dalam daftar input (dan mungkin juga bilangan bulat lainnya), menghitung multiplisitas. Mereka tidak perlu terjadi dalam urutan yang sama seperti pada input, dan output tidak perlu minimal dalam arti apa pun.

Contoh

Untuk input [2,-4,2], output yang dapat diterima adalah [2,2,-1,1,-4].

Aturan dan penilaian

Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan. Termasuk beberapa contoh input dan output dalam jawaban Anda dihargai.

Uji kasus

Ini diberikan dalam format 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
sumber

Jawaban:

11

Jelly, 12 byte

ż~Ṣ€FxA$;L$U

Cobalah online!

Latar Belakang

Pertimbangkan pasangan bilangan bulat n, ~ n , di mana n ≥ 0 dan ~ menunjukkan bitwise TIDAK, yaitu ~ n = - (n + 1) .

Dengan menempatkan n salinan n di sebelah kiri n + 1 salinan ~ n , jika kita mulai melintasi larik pointer dari paling kanan ~ n , kita akan melintasi semua elemen 2n + 1 dan menemukan diri kita di sebelah kiri n paling kiri. .

Misalnya, jika n = 4 :

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

Untuk kasus khusus n = 0 , elemen n itu sendiri diulang 0 kali, meninggalkan ini:

X -1
   ^
^

Untuk setiap bilangan bulat k dalam input, kita dapat membentuk pasangan n, ~ n yang berisi k dengan mengatur n = k jika k> 0 dan n = ~ k jika k <0 . Ini berfungsi karena ~ adalah involusi, yaitu, ~~ k = k .

Yang tersisa untuk dilakukan adalah rantai tupel yang dihasilkan dan tambahkan panjang gabungannya, sehingga elemen paling kiri membawa kita kembali ke yang paling kanan.

Contohnya

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

Bagaimana itu bekerja

ż~Ṣ€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
sumber
Anda tidak perlu menangani case khusus n = 0, karena speknya bertuliskan " bilangan nol ".
Peter Taylor
Sementara 0 tidak akan pernah muncul di input, saya masih membutuhkan pasangan 0, -1 jika -1 tidak.
Dennis