Eu deveria classificar uma lista de números, mas sou super preguiçosa. É realmente difícil descobrir como trocar todos os números até que todos estejam em ordem crescente, então criei meu próprio algoritmo que garantirá que a nova lista seja classificada¹. Veja como funciona:
Para uma lista do tamanho N , precisaremos de iterações N-1 . Em cada iteração,
Verifique se o número N é o menor que o número N + 1 . Se for, esses dois números já estão classificados e podemos pular essa iteração.
Se não estiverem, será necessário decrementar continuamente os primeiros N números até que esses dois números estejam em ordem.
Vamos dar um exemplo concreto. Digamos que a entrada foi
10 5 7 6 1
Na primeira iteração, compararemos 10 e 5. 10 é maior que 5, portanto, a diminuímos até que seja menor:
4 5 7 6 1
Agora, comparamos 5 e 7. 5 é menor que 7, portanto, não precisamos fazer nada nessa iteração. Então, vamos para a próxima e comparamos 7 e 6. 7 é maior que 6, então diminuímos os três primeiros números até que seja menor que 6 e obtemos o seguinte:
2 3 5 6 1
Agora, comparamos 6 e 1. Novamente, 6 é maior que 1, então diminuímos os quatro primeiros números até que seja menor que 1 e obtemos o seguinte:
-4 -3 -1 0 1
E nós terminamos! Agora nossa lista está em perfeita ordem de classificação. E, para tornar as coisas ainda melhores, tivemos apenas que percorrer a lista N-1 vezes, então esse algoritmo classifica as listas em tempo O (N-1) , o que tenho certeza de que é o algoritmo mais rápido que existe.²
Seu desafio hoje é implementar esse Lazy Sort. Seu programa ou função receberá uma matriz de números inteiros no formato padrão que você desejar, e você deverá executar essa classificação lenta e retornar a nova lista "classificada" . A matriz nunca estará vazia ou conterá números não inteiros.
aqui estão alguns exemplos:
Input: 10 5 7 6 1
Output: -4 -3 -1 0 1
Input: 3 2 1
Output: -1 0 1
Input: 1 2 3
Output: 1 2 3
Input: 19
Output: 19
Input: 1 1 1 1 1 1 1 1 1
Output: -7 -6 -5 -4 -3 -2 -1 0 1
Input: 5 7 11 6 16 2 9 16 6 16
Output: -27 -25 -21 -20 -10 -9 -2 5 6 16
Input: -8 17 9 7
Output: -20 5 6 7
Como sempre, isso é código-golfe , então escreva o programa mais curto possível!
¹ Isso não significa o que parece, mas é tecnicamente verdade
² Estou completamente brincando, por favor, não me odeie
fonte
<sarcasm>
Na verdade, esse algoritmo de classificação ainda se destaca naO(N^2)
complexidade do tempo, porque você precisa passar por todos os itens acessados anteriormente na lista para diminuí-los. Eu recomendo ir através da lista para trás em vez e diminuir apenas um número por etapa conforme necessário. Isso lhe dará verdadeiraO(N)
complexidade!</sarcasm>
O(n^2)
em termos de acessos à memória, mas não éO(n)
para comparações?O(N^2)
.Respostas:
Geléia ,
14 12 119 bytes-2 bytes graças a ETHproductions (use a díade mínima
«
)Um link monádico que recebe e retorna listas de números inteiros.
Experimente online! ou veja a suíte de testes .
Eu realmente não acho que isso seja o suficiente para o Lazy ™!
Quão?
fonte
Haskell , 40 bytes
Experimente online!
fonte
JavaScript (ES6), 61 bytes
Casos de teste
Mostrar snippet de código
fonte
Gelatina , 12 bytes
Experimente online!
Como funciona
A idéia básica em jogo é a seguinte: se você reverter as matrizes de entrada e saída, a saída será simplesmente a entrada com cada delta de 0 ou mais substituído por -1. Por exemplo:
fonte
k, 20 bytes
Experimente online.
Explicação:
fonte
Haskell, 56 bytes
Experimente online!
Manter a primeira parte da lista de parâmetro
a
. Em cada etapa, adicione o próximo elementox
ao final dea
e aumente todos os elementos de a pelo mínimo de(y-x-1)
e0
.fonte
Python , 54 bytes
Experimente online!
Toma entrada como splatted
f(1,2,3)
. Mostra uma lista. Usa tempo exponencial.fonte
C #, 76 bytes
Isso modifica a lista no local. Ele percorre a lista ao contrário e mantém um total em execução do delta a ser aplicado a cada número.
fonte
JavaScript (ES6), 59 bytes
fonte
f=
para as respostas JS salvar dois bytesf(a)
), portanto ainda requer o nome.Flak cerebral , 153 bytes
Experimente online!
Isso inclui
+1
a-r
bandeira.fonte
R, 56 bytes
function(s){s-c(rev(cumsum(rev(pmax(0,-diff(s)+1)))),0)}
fonte
diff
, eu estava tentando descobrir como fazer isso funcionar ... Aliás, você pode se livrar das chaves ao redor do corpo da função por -2 bytes, mas, melhor ainda, você pode usar ems=scan()
vez de uma função definição para salvar mais alguns bytes. Seria ótimo se você incluísse um link para Experimente online, para que outras pessoas possam verificar se esse código funciona para todos os casos de teste.JavaScript (ES6), 68 bytes
Entrada e saída é uma matriz de números inteiros.
Snippet de teste
fonte
JavaScript (ES6), 50 bytes
Explicação:
Essa é uma solução recursiva, que primeiro clona a matriz e depois diminui todos os valores até que um elemento seja maior ou igual ao próximo elemento da matriz.
A função chama a si mesma desde que qualquer elemento esteja fora de ordem. Quando os elementos são finalmente classificados, o clone é retornado. (Não podemos retornar a matriz em si, porque o
some()
método teria diminuído todos os seus elementos, desativando-os em -1.)Casos de teste:
fonte
SWI-Prolog, 194 bytes
Pode ser possível experimentá-lo on-line aqui: http://swish.swi-prolog.org/p/LazySort.pl
Você pergunta o
l(L, [10,5,7,6,1]).
que diz "resolva para L, onde L é a versão ordenada lenta desta lista".As duas funções são:
l
azysorted (A, B) - indica que A é a versão preguiçosa de B, se ambas são listas vazias ou se A pode ser obtido ao reverter B, chamando uma função auxiliar para percorrer a lista e fazer uma subtração com um acumulador empurrando cada valor abaixo do valor anterior e revertendo o resultado para o caminho certo.f
O auxiliar corresponde a duas listas, o valor do número anterior na lista e um acumulador de diferenças contínuas, e resolve o novo valor da posição atual da lista, sendo o valor original menos o acumulador de diferenças, opcionalmente menos um novo valor necessário para forçar isso. abaixo do número anterior na lista ef
deve resolver o final da lista recursivamente com o acumulador de diferenças agora aumentado.Captura de tela dos casos de teste no Swish:
fonte
JavaScript (ES6), 61 bytes
Não é a solução mais curta, mas não pude deixar passar a oportunidade de usar
reduceRight
.fonte
C # (.NET Core) ,
89 88 8679 bytesfor
s.Experimente online!
Primeiro
for
itera através da matriz, depois calcula o decremento e, finalmente, o segundofor
decrementa os elementos, se necessário, até ai
posição th.É válido apenas modificar a matriz original em vez de retornar uma nova (ainda se acostumando às regras)?
fonte