Làm mịn một danh sách


12

Bạn nên viết một chương trình hoặc hàm lấy một số nguyên không âm kvà một danh sách số nguyên được sắp xếp Llàm đầu vào và đầu ra hoặc trả về một danh sách được làm mịn M.

Mđược tạo từ danh sách tăng dần Lbằng cách chèn vào hầu hết kcác phần tử nguyên trong khi vẫn giữ danh sách được sắp xếp. Các số nguyên được chèn nên được chọn theo cách chênh lệch chuyển tiếp tối đa Msẽ càng nhỏ càng tốt. Chúng tôi sẽ gọi giá trị nhỏ nhất này là "độ mịn".

Sự khác biệt về phía trước của danh sách -1 3 8 11 154 5 3 4và sự khác biệt về phía trước tối đa là 5.

Với 2chèn sự mượt mà của 2 10 154và một đầu ra có thể là 2 6 10 11 15với sự khác biệt về phía trước 4 4 1 4.

Đầu vào

  • Một số nguyên không âm k.
  • Một danh sách số nguyên tăng dần Lvới ít nhất 2 phần tử.

Đầu ra

  • Danh sách số nguyên tăng dần M.
  • Nếu nhiều câu trả lời đúng tồn tại đầu ra chính xác một trong số chúng (bất kỳ câu trả lời nào là đủ).
  • Giải pháp của bạn phải giải quyết bất kỳ trường hợp kiểm tra ví dụ nào dưới một phút trên máy tính của tôi (tôi sẽ chỉ kiểm tra các trường hợp gần. Tôi có một PC dưới mức trung bình.).

Ví dụ

Đầu vào ( k, L) => Một đầu ra có thể và chênh lệch chuyển tiếp tối đa (không phải là một phần của đầu ra) trong ngoặc đơn

0, 10 20 => 10 20 (10)

2, 1 10 => 1 4 7 10 (3)

2, 2 10 15 => 2 6 10 11 15 (4)

3, 2 10 15 => 2 5 8 10 12 15 (3)

5, 1 21 46 => 1 8 15 21 27 33 39 46 (7)

5, 10 20 25 33 => 10 14 18 20 24 25 29 33 (4)

3, 4 4 6 9 11 11 15 16 25 28 36 37 51 61 => 4 4 6 9 11 11 15 16 22 25 28 36 37 45 51 59 61 (8)

15, 156 888 2015 => 156 269 382 495 608 721 834 888 1001 1114 1227 1340 1453 1566 1679 1792 1905 2015 (113)

8, -399 -35 -13 56 157 => -399 -347 -295 -243 -191 -139 -87 -35 -13 39 56 108 157 (52)

5, 3 3 3 => 3 3 3 3 (0)

Đây là môn đánh gôn nên bài dự thi ngắn nhất sẽ thắng.

Câu trả lời:


5

Bình thường, 28 27 byte

S+Qu?smt%hHrFdC,QtQ>GvzGhvz

Đầu vào được đưa ra như:

3
[2, 10, 15]

Trình diễn. Khai thác thử nghiệm.

Lưu ý: Tại thời điểm câu hỏi được hỏi, có một lỗi nhỏ trong Pyth liên quan đến việc sử dụng rFdbên trong u, mà tôi vừa sửa. Lỗi này khiến nó không thể sử dụng được Fbên trong u, điều này chắc chắn không có ý định.

S+Qu?smt%hHrFdC,QtQ>GvzGhvz

                               Implicit:
                               z is the number of insertions, in string form.
                               Q is the input list.
              C,QtQ            Pairs of elements, e.g. [(2, 10), (10, 15)]
           rFd                 d = (a, b) -> range(a, b)
        %hH                    Take every H+1th element of that range
       t                       And throw out the first one.
      m                        Perform this process for each element pair
     s                         And combine the results into one list.

                               The above is a minimal set of additional elements
                               To reduce the maximal difference to H+1.

  u                     hvz    Repeat until the result stops changing, where
                               the prior result is G, H starts at 0 and
                               increases by 1 each repetition, and
                               G is initialized to eval(z)+1.
   ?               >GvzG       If not G[eval(z):], return G. In other words,
                               if the prior result was short enough, stop.
                               Also, this is always false on the initial call.
    smt%hHrFdC,QtQ             Otherwise, recalculate with H incremented.
S+Q                            Take the result, add the original list, and sort.

Đây là một phiên bản sẽ làm việc với thông dịch viên tại thời điểm câu hỏi được hỏi. Đó là 28 byte và hoạt động chính xác theo cùng một cách:

S+Qu?smt%hHr.udC,QtQ>GvzGhvz

Trình diễn.

Cam kết Git của phiên bản phù hợp, f6b40e62


Tôi chưa bao giờ nghĩ đến việc sử dụng rF<seq>để giải nén các bộ dữ liệu hai yếu tố.
orlp

@orlp Đó là một mẹo hay và tôi đã sử dụng nó từ ngày khi uhoạt động khác đi và ekhông tồn tại, urGHdngắn hơn rhd@d1. Tôi sẽ đặt nó trên trang thủ thuật Pyth.
isaacg

Bạn có thể cạo sạch một nhân vật, bạn không cần U.
orlp

@orlp Cảm ơn. Trên thực tế, yvzthất bại khi vz = 0, nhưng hvzthực hiện các mẹo.
isaacg

Vì mã sẽ không hoạt động với phiên bản Pyth có sẵn khi câu hỏi được hỏi, tôi đã chọn không chấp nhận giải pháp này. Nếu bạn đưa ra câu trả lời không dựa vào lỗi, hãy ping tôi và tôi sẽ chấp nhận.
ngẫu nhiên

8

Con trăn 2, 104

def f(L,k,d=1):
 M=[];p=L[0]
 for x in L:M+=range(p+d,x,d);p=x
 return M[k:]and f(L,k,d+1)or sorted(L+M)

Thử các mức tăng tối đa khác nhau d, bắt đầu từ 1 và đếm lên. Lấp đầy khoảng trống của từng cặp (p,x)yếu tố kế tiếp bằng cách lấy mọi dsố thứ tự trong khoảng trống. Nếu Mdài hơn hạn ngạch cho phép, hãy truy xuất để thử mức cao hơn d. Nếu không, trả về một danh sách các yếu tố được thêm vào và ban đầu, được sắp xếp.

Điều này thực hiện tất cả các trường hợp thử nghiệm mà không có sự chậm trễ trên máy của tôi.


Bạn đã thử một cái gì đó như 1, 1000000000?
edc65

@ edc65 Điều đó sẽ mất thuật toán này thực sự, rất lâu, nhưng tôi chạy theo chiều sâu ngăn xếp trước đó.
xnor
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.