Сортування за блоками перетасування


18

Блок сортування перетасовок

Блок перетасування сортування є (а штучним) методом сортування списку. Це працює так, проілюстровано прикладом.

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

Розділ на суміжні блоки можна вибрати довільно. Однак не всі варіанти блоків дадуть відсортований список наприкінці:

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

Якщо всі блоки мають довжину 1, або якщо є лише один блок, результат, звичайно, буде сортований. Але це досить екстремальні випадки. У цьому завданні ваше завдання - знайти баланс між кількістю блоків та максимальною довжиною блоку.

Завдання

Ваш вхід - це порожній список цілих чисел L , взятих у будь-якому розумному форматі. Ваш висновок повинен бути найменше ціле число N таке , що L може бути блок відтворення в довільному порядку упорядковано таким чином , що число блоків , а довжина кожного блоку знаходяться в більшості N .

Виграє найменший кількість байтів у кожній мові. Діють стандартні правила .

Тестові справи

[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

Відповіді:


5

Брахілог , 23 22 20 19 байт

Завдяки Zgarb, H.PWiz і Fatalize за збереження деякої кількості байтів.

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

Спробуйте в Інтернеті!

Я впевнений, що тут є більше для гольфу ...

Пояснення

~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

Желе , 17 байт

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

Спробуйте в Інтернеті!

Альтернативна версія, 15 байт, виклик після публікації

В останній версії Ɗпоєднує три ланки в монадійний ланцюг. Це дозволяє наступні гольфи.

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

Спробуйте в Інтернеті!

Як це працює

Ṣ€Ṣ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 байт CP437

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

Запуск та налагодження в Інтернеті!

Кредити до @recursive для збереження 3 байтів.

Стакс тут трохи багатослівний. Для сортування масиву за замовчуванням потрібно два байти, два байти для отримання максимуму / мінімум масиву та два байти для вирівнювання масиву. У будь-якому разі я все ще розміщую рішення і сподіваюся, що можуть бути корисні пропозиції щодо його вдосконалення .

Пояснення

Використовує розпаковану версію для пояснення.

%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


1
Це своєрідна невтішна робота для stax, але я продовжую шукати заощадження.
рекурсивна


Це просто ... дивовижно.
Вейджун Чжоу

Спасибі. Мені було смішно, що гіперпосилання використовувало саме максимальний розмір коментаря, замінивши "https: //" на "http: //".
рекурсивна

2

Брахілог , 17 байт

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

Спробуйте в Інтернеті!

Пояснення

Це самовідповідь; Я створив цей виклик, маючи на увазі Брахілог, і знайшов ~c₎{…}ᵈцікаву конструкцію.

Вбудований cоб'єднує список списків. Якщо йому надано підпис N, він потребує кількості списків N. Символ модифікує вбудований модуль, щоб взяти пару як вхідний і використовувати його правий елемент як підпис. Таким чином, c₎займає пару [L,N], вимагає, щоб кількість списків у Lє N, і повертає конкатенацію L. При запуску в зворотному порядку ~c₎бере список Lі повертає пару [P,N], де Pє розділ Lна Nблоки. Вони перераховуються у порядку збільшення N.

Метапредмет перетворює звичайний присудок у такий, який перевіряє співвідношення між двома елементами пари. Більш чітко, {…}ᵈбере пару [A,B], перевіряє, що A{…}Bтримає, і виводить B. Я використовую це для перевірки того, що Pможна сортувати за блоком і містить лише максимум списки довжини 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.

Зверніть увагу, що Pможуть містити порожні списки. Це забезпечує правильність і в тих випадках, коли максимальна довжина блоку перевищує кількість блоків.




1

Pyth ,  24 23  20 байт

hSmeSlMs]Bd.msSSMb./

Тестовий набір.

Як це працює

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 байт

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

⎕IO повинно бути 0

Спробуйте в Інтернеті!

Як?

  • ⌊/ - Знайдіть мінімум ...
  • (⌈/≢,≢¨) - ... максимальна довжина та кількість елементів ...
  • ¨ - ... кожного елемента ...
  • T/⍨ - ... елементи, які ...
  • {S[⍋S]≡∊⍵[⍋↑⍵]}¨ - ... сортуються, коли сплющуються, з ...
  • T←{⍵[⍋⍵]}¨¨ - ... відсортовані елементи елементів ...
  • ⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵- ... розділи аргументу (разом із деяким сміттям)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.