Thử thách Mùa Vọng 6: Dán lại Dock vận chuyển!


9

<< Trước đó tiếp theo >>

Nhờ cộng đồng PPCG, Santa quản lý để sắp xếp các món quà của mình theo đúng thứ tự để di chuyển vào bến tàu vận chuyển. Thật không may, các dấu hiệu bến tàu vận chuyển bị hỏng nên anh ta không biết nơi để đặt tất cả các món quà! Tất cả các món quà được nhóm lại với nhau chứ không phải theo phạm vi của chúng, điều mà Santa thừa nhận sẽ là một ý tưởng tốt hơn.

Bây giờ, đưa ra các món quà theo thứ tự được sắp xếp, xác định tất cả các cấu hình phạm vi tối thiểu có thể sẽ dẫn đến hiện tại theo đúng thứ tự. Đó là, tìm tất cả các cấu hình phạm vi tối thiểu sao cho việc sắp xếp các món quà theo thuật toán trong Thử thách số 5 sẽ không thay đổi thứ tự.

Thử thách

Một cấu hình phạm vi tối thiểu là một danh sách các phạm vi sao cho các phạm vi đó càng nhỏ càng tốt. Nghĩa là, nếu một phạm vi được chỉ định để bao gồm một tập hợp con cụ thể của quà tặng, thì mức tối thiểu và tối đa của phạm vi phải giống với phạm vi của tập hợp con. Nói cách khác, thu nhỏ bất kỳ phạm vi nào trong trang bìa sẽ khiến nó không còn là trang bìa nữa.

Thách thức là tìm tất cả các cấu hình phạm vi tối thiểu có thể áp dụng cho các kích thước hiện tại. Hãy lấy một ví dụ:[3, 1, 2, 5, 4, 7, 6]

Có một trường hợp tầm thường, đó là lấy phạm vi của toàn bộ cấu hình hiện tại. Trong trường hợp này, [[1, 7]]sẽ là một giải pháp.

Đối với các ví dụ có các phần tử duy nhất, một trường hợp tầm thường khác sẽ là [[3], [1], [2], [5], [4], [7], [6]](vì các phạm vi không cần phải được đặt hàng).

Trong ví dụ này, chúng tôi cũng thấy rằng [[1, 3], [4, 7]][[1, 3], [4, 5], [6, 7]]sẽ làm việc, cũng như [[1, 3], [5], [4], [6, 7]][[1, 3], [4, 5], [7], [6]].

Câu trả lời cuối cùng [3, 1, 2, 5, 4, 7, 6]sẽ là [[[3], [1], [2], [5], [4], [7], [6]], [[3], [1], [2], [5], [4], [6, 7]], [[3], [1], [2], [4, 5], [7], [6]], [[3], [1], [2], [4, 5], [6, 7]], [[3], [1], [2], [4, 7]], [[3], [1, 2], [5], [4], [7], [6]], [[3], [1, 2], [5], [4], [6, 7]], [[3], [1, 2], [4, 5], [7], [6]], [[3], [1, 2], [4, 5], [6, 7]], [[3], [1, 2], [4, 7]], [[1, 3], [5], [4], [7], [6]], [[1, 3], [5], [4], [6, 7]], [[1, 3], [4, 5], [7], [6]], [[1, 3], [4, 5], [6, 7]], [[1, 3], [4, 7]], [[1, 5], [7], [6]], [[1, 5], [6, 7]], [[1, 7]]].

Định dạng thông số kỹ thuật

Đầu vào sẽ được cung cấp dưới dạng một danh sách phẳng các số nguyên dương trong phạm vi số được hỗ trợ hợp lý của ngôn ngữ của bạn ở bất kỳ định dạng hợp lý nào. Đầu vào có thể chứa các yếu tố trùng lặp. Đầu ra phải được đưa ra dưới dạng danh sách 3D các số nguyên dương ở bất kỳ định dạng hợp lý nào.

Mỗi phạm vi trong đầu ra của bạn (nằm ở lớp thứ hai) có thể được biểu diễn dưới dạng [min, max], [num]nếu đó là một phạm vi giá trị đơn hoặc là toàn bộ phạm vi, nhưng định dạng đầu ra của bạn phải nhất quán. Vui lòng xác định nếu bạn muốn sử dụng một định dạng đầu ra hợp lý hơi khác nhau.

Các giá trị trùng lặp phải được bao phủ bởi một phạm vi duy nhất trong đầu ra; nghĩa là, không có hai phạm vi trong đầu ra có thể có bất kỳ sự chồng chéo nào.

Giải pháp của bạn có thể trả về các phạm vi theo bất kỳ thứ tự nào và điều này không phải là xác định.

Quy tắc

  • Áp dụng sơ hở tiêu chuẩn
  • Đây là vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng
  • Không có câu trả lời sẽ được chấp nhận

Test Case cho một danh sách với các yếu tố trùng lặp:

2 3 2 4 -> [[[2, 3], [4]], [[2, 4]]]

Thực hiện tham khảo

Tiêu đề là liên kết.

Lưu ý: Tôi đã lấy cảm hứng cho loạt thử thách này từ Advent Of Code . Tôi không có liên kết với trang web này

Bạn có thể xem danh sách tất cả các thử thách trong chuỗi bằng cách xem phần 'Liên kết' của thử thách đầu tiên tại đây .

Chúc bạn chơi golf vui vẻ!

Câu trả lời:



3

Brachylog , 17 16 byte

{~c⟨⌋⟦₂⌉⟩ᵐ.c≠∧}ᶠ

Hoạt động trên danh sách với các bản sao là tốt. Phạm vi được thể hiện bằng danh sách các yếu tố mà chúng chứa. Hãy thử trực tuyến!

Giải trình

Ý tưởng là chia danh sách thành các khối và biến đổi các khối thành phạm vi, sau đó xác minh rằng chúng không trùng nhau.

{~c⟨⌋⟦₂⌉⟩ᵐ.c≠∧}ᶠ  Input is a list.
{             }ᶠ  Compute all possible outputs for this predicate:
 ~c                Break the list into contiguous blocks.
   ⟨    ⟩ᵐ         For each block,
    ⌋  ⌉           take its minimum and maximum,
     ⟦₂            and create the range between them.
          .        This is the output.
           c       Also, if you concatenate the output,
            ≠      its elements are distinct.
             ∧     Prevent the interpreter from thinking this is also the output.

1

JavaScript (ES6), 166 164 byte

Chỉnh sửa: phiên bản cập nhật hiện hỗ trợ trùng lặp

In kết quả trực tiếp lên bàn điều khiển ở định dạng [min, max] .

f=(a,r=[],l=0)=>a[l++]?f([...a],r,l,f(a,[...r,[Math.min(...x=a.splice(0,l)),Math.max(...x)]])):a[0]|r.some(([x,y],i)=>r.some(([z])=>i--&&z>=x&z<=y))||console.log(r)

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


0

Python 2 , 179 byte

lambda l:[l for l in[[range(min(x),max(x)+1)for x in P]for P in p(l)]if len(sum(l,[]))==len(set(sum(l,[])))]
p=lambda l:[[l[:i]]+a for i in range(1,len(l))for a in p(l[i:])]+[[l]]

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

Xuất ra một danh sách các phạm vi đầy đủ.

Lấy cảm hứng mạnh mẽ từ việc thực hiện tham khảo.

Xây dựng tất cả các phân vùng, sau đó phạm vi tối thiểu / tối đa cho mỗi phân vùng. Một danh sách các phạm vi là hợp lệ nếu không có giá trị xuất hiện nhiều hơn một lần trong danh sách.


sum(l,[]) làm phẳng danh sách các danh sách và cho phép tôi kiểm tra các bản sao:

l=[[1, 2], [2, 3]]
sum(l,[]) = [1,2,2,3]
len([1,2,2,3] == len(set([1,2,2,3]))  -> False (duplicates)

0

Bình thường , 17 byte

f{IsTmm}hSkeSkd./

Hãy thử nó ở đây!

Bây giờ thì tốt hơn nhiều . Đầu ra toàn bộ phạm vi. Xem lịch sử sửa đổi cho phiên bản trước (ở mức 31 byte đáng kinh ngạc).

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

f {IsTmm} hSkeSkd./ ~> Chương trình đầy đủ.

               ./ ~> Danh sách phân vùng.
     m ~> Bản đồ sử dụng biến d.
      md ~> Ánh xạ qua d sử dụng biến k.
        hSk ~> Tối thiểu của k.
           eSk ~> Tối đa của k.
       } ~> Phạm vi số nguyên bao gồm.
f ~> Lọc những ...
   sT ~> Mà, khi làm phẳng,
 {I ~> Là bất biến trên sự trùng lặp.
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.