Classificação aleatória de bloco
A classificação aleatória de bloco é um método (bastante artificial) de classificar uma lista. Funciona da seguinte maneira, ilustrado por um exemplo.
[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]
A partição em blocos contíguos pode ser escolhida arbitrariamente. No entanto, nem todas as opções de blocos produzirão uma lista classificada no final:
[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]
Se todos os blocos tiverem o comprimento 1 ou se houver apenas um bloco, o resultado será naturalmente classificado. Mas esses são casos bastante extremos. Nesse desafio, sua tarefa é encontrar um equilíbrio entre o número de blocos e o comprimento máximo de um bloco.
A tarefa
Sua entrada é uma lista não vazia de números inteiros L , obtidos em qualquer formato razoável. Sua saída deve ser o menor inteiro N tal que L pode ser bloco aleatório ordenados de forma que o número de blocos eo comprimento de cada bloco são, no máximo, N .
A contagem de bytes mais baixa em cada idioma vence. Aplicam-se as regras de código-golfe padrão .
Casos de teste
[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
Braquilog , 17 bytes
Experimente online!
Explicação
Esta é uma resposta automática; Eu projetei esse desafio com Brachylog em mente e encontrei
~c₎{…}ᵈ
uma construção interessante.O
c
interno concatena uma lista de listas. Se for fornecido um subscritoN
, será necessário o número de listasN
. O símbolo₎
modifica um built-in para receber um par como entrada e usar o elemento correto como subscrito. Assim,c₎
pega um par[L,N]
, requer que o número de listas emL
sejaN
e retorne a concatenação deL
. Quando executado em sentido inverso,~c₎
pega uma listaL
e retorna um par[P,N]
, ondeP
é uma partição deL
emN
blocos. Eles são enumerados em ordem crescente deN
.O metapredicado
ᵈ
transforma um predicado comum em um que verifica uma relação entre os dois elementos de um par. Mais explicitamente,{…}ᵈ
pega um par[A,B]
, verifica aA{…}B
retenção e a saídaB
. Uso-o para verificar se éP
possível classificar blocos e contém apenas listas de comprimento, no máximoN
.Observe que
P
pode conter listas vazias. Isso garante a correção também nos casos em que o comprimento máximo de um bloco é maior que o número de blocos.fonte
Python 2 ,
186146 bytesExperimente online!
A segunda função é retirada dessa dica pelo feersum .
fonte
Ruby , 158 bytes
Experimente online!
fonte
Pitão ,
24 2320 bytesSuíte de teste.
Como funciona
fonte
APL (Dyalog Classic) ,
7167 bytes⎕IO
devemos ser0
Experimente online!
Quão?
⌊/
- Encontre o mínimo de ...(⌈/≢,≢¨)
- ... o máximo do comprimento e número de elementos ...¨
- ... de cada elemento de ...T/⍨
- ... os elementos que ...{S[⍋S]≡∊⍵[⍋↑⍵]}¨
- ... são classificados quando achatados, de ...T←{⍵[⍋⍵]}¨¨
- ... os elementos classificados dos elementos de ...⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵
- ... as partições do argumento (junto com algum lixo)fonte