Sắp xếp theo khối xáo trộn


18

Khối sắp xếp xáo trộn

Các loại khối ngẫu nhiên là một phương pháp (chứ không phải nhân tạo) phân loại một danh sách. Nó hoạt động như sau, được minh họa bằng một ví dụ.

[6, 1, 0, 3, 2, 4, -2, -1]
                            Break list into contiguous blocks
[6][1, 0][3, 2, 4][-2, -1]
                            Sort each block
[6][0, 1][2, 3, 4][-2, -1]
                            Sort blocks lexicographically
[-2, -1][0, 1][2, 3, 4][6]
                            Concatenate
[-2, -1, 0, 1, 2, 3, 4, 6]

Phân vùng thành các khối liền kề có thể được chọn tùy ý. Tuy nhiên, không phải tất cả các lựa chọn khối sẽ mang lại một danh sách được sắp xếp ở cuối:

[6, 1, 0, 3, 2, 4, -2, -1]
[6, 1, 0][3, 2, 4][-2, -1]
[0, 1, 6][2, 3, 4][-2, -1]
[-2, -1][0, 1, 6][2, 3, 4]
[-2, -1, 0, 1, 6, 2, 3, 4]

Nếu tất cả các khối có chiều dài 1 hoặc nếu chỉ có một khối thì kết quả tất nhiên sẽ được sắp xếp. Nhưng đây là những trường hợp khá cực đoan. Trong thử thách này, nhiệm vụ của bạn là tìm sự cân bằng giữa số lượng khối và chiều dài tối đa của một khối.

Nhiệm vụ

Đầu vào của bạn là một danh sách không có số nguyên L , được lấy ở bất kỳ định dạng hợp lý nào. Đầu ra của bạn sẽ là số nguyên nhỏ nhất NL có thể được ngăn chặn ngẫu nhiên được sắp xếp sao cho số khối và độ dài của mỗi khối là tại hầu hết các N .

Số byte thấp nhất trong mỗi ngôn ngữ sẽ thắng. Luật tiêu chuẩn được áp dụng.

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

[5] -> 1
[1,2] -> 2
[0,2,1,-1] -> 3
[-1,0,2,1] -> 2
[9,3,8,2,7] -> 4
[9,2,8,3,7] -> 3
[5,9,3,7,2,4,8] -> 7
[-1,-2,1,2,-1,-2,7] -> 4
[6,1,0,3,2,4,-2,-1] -> 4
[12,5,6,-6,-1,0,2,3] -> 3
[1,0,1,0,1,0,1,0,1,0] -> 6
[1,2,1,3,1,2,3,2,4,3] -> 5
[7,7,7,7,8,9,7,7,7,7] -> 4

Câu trả lời:


5

Brachylog , 23 22 20 19 byte

Cảm ơn Zgarb, H.PWiz và Fatalize đã lưu một số lượng byte.

~cᶠ{oᵐoc≤₁&≡ᵃlᵐ⌉}ˢ⌋

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

Tôi chắc chắn có nhiều hơn để chơi golf ở đây ...

Giải trình

~cᶠ      Find all lists that concatenate into the input, i.e. all partitions
         of the input.
{        Discard all partitions for which this predicate fails, and replace
         the rest with the output of this predicate.
  oᵐ       Sort each sublist of the partition.
  o        Sort the entire list.
  c≤₁      And require concatenation of the result to be sorted.
  &        Then:
  ≡ᵃ       Append the partition to itself.
  lᵐ       Map "length" over this list, i.e. we get the length of each block, as
           well as the length of the partition itself.
  ⌉        Take the maximum.
}ˢ
⌋        Take the minimum of all those maxima.

3

Thạch , 17 byte

Ṣ€ṢF
ŒṖÇÐṂ+Z$€L€Ṃ

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

Phiên bản thay thế, 15 byte, thách thức postdates

Trong phiên bản mới nhất, Ɗkết hợp ba liên kết thành một chuỗi đơn nguyên. Điều này cho phép chơi golf sau đây.

ŒṖṢ€ṢFƊÐṂ+ZLƊ€Ṃ

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

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

Ṣ€ṢF          Helper link. Argument: P (partitioned array)

Ṣ€            Sort each chunk.
  Ṣ           Sort the sorted chunks.
   F          Flatten.


ŒṖÇÐṂ+Z$€L€Ṃ  Main link. Argument: A (array)

ŒṖ            Generate all partitions of A.
  ÇÐṂ         Keep those for which the helper link returns the minimal array, i.e.,
              those that return sorted(A).
     +Z$€     Add each partition to its transpose.
              Due to how Jelly vectorizes, the length of the sum is the maximum of
              the length of the operands, and the length of the transpose is the
              length of the array's largest column.
         L€   Take the length of each sum.
           Ṃ  Take the minimum.

2

Stax , 28 26 25 24 23 byte CP437

é%(>ù│ê²☻û◙T╠►╜◘íaæAtI╥

Chạy và gỡ lỗi trực tuyến!

Tín dụng cho @recursive để lưu 3 byte.

Stax là một chút dài dòng ở đây. Theo mặc định, cần hai byte để sắp xếp một mảng, hai byte để lấy tối đa / tối thiểu của một mảng và hai byte để làm phẳng một mảng. Dù sao tôi vẫn đang đăng giải pháp và hy vọng có thể có những gợi ý hữu ích về cách cải thiện nó .

Giải trình

Sử dụng phiên bản giải nén để giải thích.

%cFxs|!F{{omo:f:^!C_Mch\%|m
%cFxs|!F                        Do for all partitions, grouped by number of sub-arrays
                                    Grouping by number of sub-arrays in this problem does not help but it's the default                    
        {{om{o                  Sort inside block then sort blocks lexicographically
              :f:^              The result when flattened is sorted
                  !C            Skip the rest of the loop if the last line is false
                    _|<         Take the current partition, pad to the longest

                       h        Take the first element, whose length is now the maximum of all sub-arrays in the original partition
                        \       Zip with the current partition, the shorter one is repeated
                         %      Number of elements
                                Which is the maximum of all sub-array sizes and the number of sub-arrays in the current partition  
                          |m    Take the minimum among all choices of partitions

Điều này mang lại cho 25.
đệ quy

1
Đây là một loại hiệu suất đáng thất vọng cho stax, nhưng tôi sẽ tiếp tục tìm kiếm tiết kiệm.
đệ quy


Điều đó thật ... tuyệt vời.
Weijun Zhou

Cảm ơn. Tôi thấy thật thú vị khi siêu liên kết đã sử dụng chính xác kích thước nhận xét tối đa, sau khi thay thế "https: //" bằng "http: //".
đệ quy

2

Brachylog , 17 byte

~c₎{oᵐoc≤₁&lᵐ⌉≤}ᵈ

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

Giải trình

Đây là một câu trả lời tự; Tôi đã thiết kế thử thách này với Brachylog trong đầu và tìm thấy ~c₎{…}ᵈmột cấu trúc thú vị.

Việc xây dựng trong cconcatenates một danh sách liệt kê. Nếu nó được cung cấp một chỉ mục N, nó yêu cầu số lượng danh sách N. Biểu tượng sửa đổi một tích hợp để lấy một cặp làm đầu vào và sử dụng phần tử bên phải của nó làm chỉ mục. Như vậy c₎phải mất một cặp [L,N], đòi hỏi số lượng danh sách trong LN, và trả về nối của L. Khi chạy ngược lại, ~c₎lấy một danh sách Lvà trả về một cặp [P,N], trong đó Plà một phân vùng Lthành Ncác khối. Chúng được liệt kê theo thứ tự tăng dần N.

Metapredicate biến đổi một vị từ thông thường thành một vị trí kiểm tra mối quan hệ giữa hai yếu tố của một cặp. Rõ ràng hơn, {…}ᵈlấy một cặp [A,B], kiểm tra A{…}Bgiữ và đầu ra B. Tôi sử dụng nó để xác minh rằng Pcó thể được sắp xếp theo khối và chỉ chứa tối đa danh sách độ dài N.

~c₎{oᵐoc≤₁&lᵐ⌉≤}ᵈ  Input is a list, say L = [9,2,8,3,7].
~c₎                Guess the pair [P,N]: [[[9],[2],[8,3,7]],3]
   {           }ᵈ  Verify this predicate on P and N and return N:
    oᵐ              Sort each list in P: [[9],[2],[3,7,8]]
      o             Sort lexicographically: [[2],[3,7,8],[9]]
       c            Concatenate: [2,3,7,8,9]
        ≤₁          This list is nondecreasing: true.
          &lᵐ       Length of each list in P: [1,1,3]
             ⌉      Maximum: 3
              ≤     This is at most N: true.

Lưu ý rằng Pcó thể chứa danh sách trống. Điều này đảm bảo tính chính xác trong những trường hợp độ dài tối đa của một khối lớn hơn số khối.




1

Bình thường ,  24 23  20 byte

hSmeSlMs]Bd.msSSMb./

Bộ thử nghiệm.

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

hSmeSlMs]Bd.msSSMb./ – Full program. Hereby, Q represents the input.
                  ./ – All possible partitions of Q.
           .m        – Take the partitions which yield a minimal (i.e. sorted) list over:
             sSSMb   – Sorting function. Uses the variable b.
               SMb   – Sort each list in each partition b.
              S      – Sort the partition b.
             s       – And flatten (by 1 level).
  meSlMs]Bd          – Map. Uses a function whose variable is d.
        ]Bd          – Pair d with its wrapping in a singleton list. Returns [d, [d]].
       s             – Flatten (by 1 level). Returns [*d, d], where "*" is splatting.
     lM              – Take the length of each element.
   eS                – Retrieve the maximal length.
hS                   – Return the minimum element of the list of maximal lengths.

0

APL (Dyalog Classic) , 71 67 byte

{⌊/(⌈/≢,≢¨)¨T/⍨{S[⍋S]≡∊⍵[⍋↑⍵]}¨T←{⍵[⍋⍵]}¨¨⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵}

⎕IO cần phải 0

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

Làm sao?

  • ⌊/- Tìm mức tối thiểu của ...
  • (⌈/≢,≢¨)- ... tối đa về chiều dài và số lượng phần tử ...
  • ¨- ... của từng yếu tố của ...
  • T/⍨- ... những yếu tố ...
  • {S[⍋S]≡∊⍵[⍋↑⍵]}¨- ... được sắp xếp khi làm phẳng, của ...
  • T←{⍵[⍋⍵]}¨¨- ... các yếu tố được sắp xếp của các yếu tố của ...
  • ⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵- ... các phân vùng của đối số (cùng với một số rác)
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.