Блок случайной сортировки
Блок перетасовка сортировка является (а искусственным) методом сортировки списка. Работает следующим образом, иллюстрируется примером.
[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
Брахилог , 17 байт
Попробуйте онлайн!
объяснение
Это самоответ; Я разработал эту задачу с учетом Brachylog и нашел
~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
.Обратите внимание, что
P
могут содержать пустые списки. Это обеспечивает корректность и в тех случаях, когда максимальная длина блока больше, чем количество блоков.источник
Python 2 ,
186146 байтПопробуйте онлайн!
Вторая функция берется из этого наконечника по feersum .
источник
Рубин , 158 байт
Попробуйте онлайн!
источник
Pyth ,
24 2320 байтТестирование.
Как это устроено
источник
APL (Dyalog Classic) ,
7167 байт⎕IO
должно быть0
Попробуйте онлайн!
Как?
⌊/
- Найти минимум ...(⌈/≢,≢¨)
- ... максимальная длина и количество элементов ...¨
- ... каждого элемента ...T/⍨
- ... элементы, которые ...{S[⍋S]≡∊⍵[⍋↑⍵]}¨
- ... сортируются при выравнивании, из ...T←{⍵[⍋⍵]}¨¨
- ... отсортированные элементы элементов ...⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵
- ... разделы аргумента (вместе с мусором)источник