Tạo một mảng lặp


15

Giới thiệu

Một mảng con trỏ là một mảng Lcủa nonzero số nguyên nơi 0 ≤ L[i]+i < len(L)giữ cho tất cả các chỉ số i(giả sử 0 dựa trên chỉ mục). Chúng tôi nói rằng chỉ số i trỏ đến chỉ số L[i]+i. Mảng con trỏ là một vòng lặp nếu các chỉ số tạo thành một chu kỳ dài len(L). Dưới đây là một số ví dụ:

  • [1,2,-1,3]không phải là một mảng con trỏ, bởi vì 3nó không trỏ đến một chỉ mục.
  • [1,2,-1,-3]là một mảng con trỏ, nhưng không phải là một vòng lặp, vì không có chỉ mục nào trỏ đến -1.
  • [2,2,-2,-2] là một mảng con trỏ, nhưng không phải là một vòng lặp, bởi vì các chỉ số tạo thành hai chu kỳ.
  • [2,2,-1,-3] là một vòng lặp.

Đầu vào

Đầu vào của bạn là một danh sách không trống các số nguyên khác, ở bất kỳ định dạng hợp lý nào. Nó có thể chưa được sắp xếp và / hoặc chứa các bản sao.

Đầu ra

Đầu ra của bạn sẽ là một vòng lặp chứa tất cả các số nguyên trong danh sách đầu vào (và có thể cả các số nguyên khác nữa), tính bội số. Chúng không cần phải xảy ra theo thứ tự như trong đầu vào, và đầu ra không cần phải tối thiểu theo bất kỳ ý nghĩa nào.

Thí dụ

Đối với đầu vào [2,-4,2], một đầu ra chấp nhận được sẽ là [2,2,-1,1,-4].

Quy tắc và tính điểm

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép. Bao gồm một vài ví dụ đầu vào và đầu ra trong câu trả lời của bạn được đánh giá cao.

Các trường hợp thử nghiệm

Chúng được đưa ra trong định dạng 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]

Câu trả lời:


11

Thạch, 12 byte

ż~Ṣ€FxA$;L$U

Hãy thử trực tuyến!

Lý lịch

Xét cặp số nguyên n, ~ n , trong đó n 0~ biểu thị bit bit KHÔNG, tức là ~ n = - (n + 1) .

Bằng cách đặt n bản sao của n ở bên trái của n + 1 bản sao của ~ n , nếu chúng ta bắt đầu di chuyển qua mảng con trỏ từ ngoài cùng bên phải ~ n , chúng ta sẽ đi qua tất cả các phần tử 2n + 1 và thấy mình ở bên trái của n bên trái .

Ví dụ: nếu n = 4 :

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

Đối với trường hợp đặc biệt n = 0 , phần tử n được lặp lại 0 lần, để lại điều này:

X -1
   ^
^

Với mỗi số nguyên k trong đầu vào, chúng ta có thể tạo thành một cặp n, ~ n chứa k bằng cách đặt n = k nếu k> 0n = ~ k nếu k <0 . Điều này hoạt động vì ~ là một sự tham gia, tức là, ~ ~ k = k .

Tất cả những gì còn lại phải làm là xâu chuỗi các bộ dữ liệu được tạo và thêm vào độ dài kết hợp của chúng, vì vậy phần tử ngoài cùng bên trái sẽ đưa chúng ta trở về phần bên phải nhất.

Ví dụ

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

Làm thế nào nó hoạt động

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

Bạn không cần phải xử lý trường hợp đặc biệt n = 0, bởi vì thông số kỹ thuật nói " số nguyên khác không ".
Peter Taylor

Mặc dù 0 sẽ không bao giờ xảy ra trong đầu vào, tôi vẫn cần cặp 0, -1 nếu -1 .
Dennis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.