Karıştırma bloklarına göre sırala


18

Blok karıştırma sıralaması

Blok shuffle sıralama listesini sıralamak bir (daha doğrusu yapay) yöntemidir. Bir örnekle gösterildiği gibi aşağıdaki gibi çalışır.

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

Bitişik bloklara bölünme keyfi olarak seçilebilir. Ancak, tüm blok seçenekleri sonunda sıralı bir liste vermeyecektir:

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

Tüm blokların uzunluğu 1 ise veya sadece bir blok varsa, sonuç elbette sıralanır. Ancak bunlar oldukça aşırı durumlar. Bu meydan okumada, göreviniz blok sayısı ile bir bloğun maksimum uzunluğu arasında bir denge bulmaktır.

Görev

Girişiniz , herhangi bir makul biçimde alınmış, L olmayan tam sayıların bir listesidir . İşletme çıkış küçük tamsayı olacaktır N , öyle ki L blok rasgele blok sayısı ve her blok uzunluğu en fazla olacak şekilde kriteri olabilir N .

Her dilde en düşük bayt sayısı kazanır. Standart kuralları geçerlidir.

Test senaryoları

[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

Yanıtlar:


5

Brachylog , 23 22 20 19 bayt

Zgarb, H.PWiz ve Fatalize'a bir miktar bayt kazandıkları için teşekkürler.

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

Çevrimiçi deneyin!

Eminim burada golf için daha fazlası var ...

açıklama

~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

Jöle , 17 bayt

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

Çevrimiçi deneyin!

Alternatif sürüm, 15 bayt, postdates meydan okuması

En son sürümde, Ɗüç bağlantıyı monadik bir zincirde birleştirir. Bu aşağıdaki golf sağlar.

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

Çevrimiçi deneyin!

Nasıl çalışır

Ṣ€Ṣ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 bayt CP437

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

Çevrimiçi çalıştırın ve hata ayıklayın!

3 bayt kaydetmek için @ recursive kredisi.

Stax burada biraz ayrıntılı. Bir diziyi varsayılan olarak sıralamak iki bayt, bir dizinin maksimum / minimum değerini almak için iki bayt ve bir diziyi düzleştirmek için iki bayt alır. Her neyse, hala çözümü gönderiyorum ve bunun nasıl geliştirileceğine dair yararlı öneriler olabileceğini umuyorum .

açıklama

Açıklamak için ambalajsız sürümü kullanır.

%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

Bu 25. verir
özyinelemeli

1
Bu stax için bir tür hayal kırıklığı yaratan bir performans, ancak tasarruf aramaya devam edeceğim.
özyinelemeli


Bu sadece ... inanılmaz.
Weijun Zhou

Teşekkürler. Ben "https: //" yerine "http: //" yerine köprü tam olarak maksimum yorum boyutu kullandığını eğlenceli buldum .
özyinelemeli

2

Brachylog , 17 bayt

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

Çevrimiçi deneyin!

açıklama

Bu kendi kendine bir cevap; Bu zorluğu Brachylog'u düşünerek tasarladım ve ~c₎{…}ᵈilginç bir yapı buldum .

Yerleşik clistelerinin birleştirir listesi. Bir alt simge verilirse N, liste sayısının olması gerekir N. Sembol , bir çifti giriş olarak alacak ve sağ öğesini alt simge olarak kullanacak şekilde yerleşik olarak değiştirir. Bu nedenle c₎, bir çift alır [L,N], listelerinde sayısı gerektirir Lolup N, ve birleştirme döndürür L. Ters içinde çalıştırdığınızda, ~c₎bir liste alır Lve bir çift döner [P,N], Pbir bölümü ise Liçine Nblokların. Onlar artan sırada sayılır N.

Metaforat , sıradan bir yüklemi bir çiftin iki elemanı arasındaki ilişkiyi kontrol eden bir yükleme dönüştürür. Daha açık {…}ᵈbir şekilde, bir çift alır [A,B], A{…}Btutanları kontrol eder ve çıktılar B. Bunu Pblok sıralanabilir ve yalnızca en fazla uzunluk listesi içerdiğini doğrulamak için kullanıyorum 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.

PBoş listeler içerebileceğini unutmayın . Bu, bir bloğun maksimum uzunluğunun blok sayısından fazla olduğu durumlarda da doğruluk sağlar.



1

Yakut , 158 bayt

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}

Çevrimiçi deneyin!


1

Pyth ,  24 23  20 bayt

hSmeSlMs]Bd.msSSMb./

Test odası.

Nasıl çalışır

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 Klasik) , 71 67 bayt

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

⎕IO olmalıdır 0

Çevrimiçi deneyin!

Nasıl?

  • ⌊/- Minimum bulmak ...
  • (⌈/≢,≢¨)- ... maksimum uzunluk ve eleman sayısı ...
  • ¨- ... her öğesinin ...
  • T/⍨- ... unsurları ...
  • {S[⍋S]≡∊⍵[⍋↑⍵]}¨- ... düzleştirildiğinde sıralanır ...
  • T←{⍵[⍋⍵]}¨¨ - ... öğelerinin sıralı öğeleri ...
  • ⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵- ... argümanın bölümleri (bazı önemsizlerle birlikte)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.