Urutkan berdasarkan pengocokan blok

18

Blokir jenis acak

The blok mengocok semacam adalah metode (bukan buatan) menyortir daftar. Ini berfungsi sebagai berikut, diilustrasikan oleh sebuah contoh.

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

Partisi menjadi blok yang berdekatan dapat dipilih secara sewenang-wenang. Namun, tidak semua pilihan blok akan menghasilkan daftar yang diurutkan di akhir:

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

Jika semua blok memiliki panjang 1, atau jika hanya ada satu blok, maka hasilnya tentu saja akan diurutkan. Tetapi ini adalah kasus yang agak ekstrim. Dalam tantangan ini, tugas Anda adalah menemukan keseimbangan antara jumlah blok dan panjang maksimum blok.

Tugas

Masukan Anda adalah daftar kosong dari bilangan bulat L , yang diambil dalam format apa pun yang masuk akal. Output Anda harus bilangan bulat terkecil N sehingga L dapat blok mengocok diurutkan sehingga jumlah blok dan panjang masing-masing blok yang paling N .

Hitungan byte terendah di setiap bahasa menang. Aturan standar berlaku.

Uji kasus

[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
Zgarb
sumber

Jawaban:

5

Brachylog , 23 22 20 19 byte

Terima kasih kepada Zgarb, H.PWiz dan Fatalize untuk menghemat sejumlah byte.

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

Cobalah online!

Saya yakin ada lagi golf di sini ...

Penjelasan

~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.
Martin Ender
sumber
3

Jelly , 17 byte

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

Cobalah online!

Versi alternatif, 15 byte, tantangan tanggal kiriman

Dalam versi terbaru, Ɗgabungkan tiga tautan ke dalam rantai monadik. Ini memungkinkan golf berikut.

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

Cobalah online!

Bagaimana itu bekerja

Ṣ€Ṣ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.
Dennis
sumber
2

Stax , 28 26 25 24 23 bytes CP437

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

Jalankan dan debug online!

Kredit ke @ rekursif untuk menghemat 3 byte.

Stax sedikit bertele-tele di sini. Dibutuhkan dua byte untuk mengurutkan array secara default, dua byte untuk mendapatkan maksimum / minimum array dan dua byte untuk meratakan array. Pokoknya saya masih memposting solusi dan berharap ada saran yang bermanfaat tentang bagaimana memperbaikinya .

Penjelasan

Gunakan versi yang belum dibongkar untuk menjelaskan.

%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
Weijun Zhou
sumber
Ini memberi 25.
rekursif
1
Ini adalah semacam kinerja mengecewakan untuk stax, tapi saya akan terus mencari penghematan.
rekursif
staxlang.xyz/…
rekursif
Itu hanya ... luar biasa.
Weijun Zhou
Terima kasih. Saya menemukan itu lucu bahwa hyperlink menggunakan persis ukuran komentar maksimum, setelah mengganti "https: //" dengan "http: //".
rekursif
2

Brachylog , 17 byte

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

Cobalah online!

Penjelasan

Ini adalah jawaban sendiri; Saya merancang tantangan ini dengan mempertimbangkan Brachylog dan menemukan gagasan ~c₎{…}ᵈyang menarik.

Built-in cmenyatukan daftar daftar. Jika diberi subskrip N, ia membutuhkan jumlah daftar N. Simbol memodifikasi built-in untuk mengambil pasangan sebagai input dan menggunakan elemen kanannya sebagai subskrip. Dengan demikian c₎mengambil pasangan [L,N], mensyaratkan bahwa jumlah daftar di Ladalah N, dan mengembalikan rangkaian L. Ketika dijalankan secara terbalik, ~c₎ambil daftar Ldan kembalikan pasangan [P,N], di mana Pada partisi Lmenjadi Nblok. Mereka disebutkan dalam urutan meningkat N.

Metapredicate mengubah predikat biasa menjadi yang memeriksa hubungan antara dua elemen pasangan. Secara lebih eksplisit, {…}ᵈdibutuhkan pasangan [A,B], cek yang A{…}Bmenahan, dan keluaran B. Saya menggunakannya untuk memverifikasi yang Pdapat diurutkan-blok dan hanya berisi daftar panjang paling banyak 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.

Catatan yang Pmungkin berisi daftar kosong. Ini memastikan kebenaran juga dalam kasus-kasus di mana panjang maksimal blok lebih besar dari jumlah blok.

Zgarb
sumber
1

Python 2 , 186 146 byte

lambda l:min(max(map(len,z+[z]))for z in p(l)if sum(s(z),[])==s(l))
p=lambda l:[q+[s(l[i:])]for i in range(len(l))for q in p(l[:i])]or[l]
s=sorted

Cobalah online!

Fungsi kedua diambil dari tip ini oleh feersum .

ovs
sumber
1

Ruby , 158 byte

f=->l,i=[],s=l.size,m=s{k=*l;i.sum==s&&i.map{|z|k.shift(z).sort}.sort.flatten==l.sort&&[m,[i.size,*i].max].min||i.sum<s&&(1..s).map{|z|f[l,i+[z],s,m]}.min||m}

Cobalah online!

Asone Tuhid
sumber
1

Pyth ,  24 23  20 byte

hSmeSlMs]Bd.msSSMb./

Suite uji.

Bagaimana itu bekerja

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.
Tuan Xcoder
sumber
0

APL (Dyalog Classic) , 71 67 byte

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

⎕IO harus 0

Cobalah online!

Bagaimana?

  • ⌊/- Temukan minimum ...
  • (⌈/≢,≢¨)- ... maksimum panjang dan jumlah elemen ...
  • ¨- ... dari setiap elemen ...
  • T/⍨- ... elemen yang ...
  • {S[⍋S]≡∊⍵[⍋↑⍵]}¨- ... disortir saat diratakan, dari ...
  • T←{⍵[⍋⍵]}¨¨- ... elemen yang diurutkan dari elemen ...
  • ⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵- ... partisi argumen (bersama dengan beberapa sampah)
Zacharý
sumber