O desafio
Na verdade, é bastante simples, classifique uma lista de números.
Detalhes
Você deve classificar uma lista de números em ordem crescente, sem usar nenhuma função de classificação / bibliotecas / etc (por exemplo, list.sort()
em Python).
A entrada / saída pode ser feita de qualquer método que você escolher, desde que seja legível por humanos.
As brechas padrão são proibidas como sempre.
O menor código em bytes vence.
Você deve explicar / listar o método de classificação que você usou (bolha, inserção, seleção etc.)
A entrada não conterá duplicatas.
Entrada / Saída de amostra
Entrada: 99,-2,53,4,67,55,23,43,88,-22,36,45
Saída: -22,-2,4,23,36,43,45,53,55,67,88,99
Nota: Um oposto quase direto de Classificar uma lista de números
[7 2 4 1] -> [4 2 3 1]
. Além disso, a lista CSV pode estar entre colchetes? Além disso, o formato de entrada específico é muito adequado para alguns idiomas e ruim para outros. Isso torna a análise de entrada uma grande parte para alguns envios e desnecessária para outros.Respostas:
05AB1E , 2 bytes
Código:
Mesmo algoritmo que a resposta Jelly . Calcula todas as permutações da entrada e sai a menor.
Experimente online!
Um método mais eficiente é:
Executa a classificação de seleção . Usa a codificação CP-1252 .
Experimente online!
fonte
Geléia, 3 bytes
Isso gera todas as permutações da lista de entrada e, em seguida, seleciona a menor permutação lexograficamente. Muito eficiente.
Créditos para @Adnan que tiveram a mesma ideia de forma independente.
Experimente online!
Gelatina, 4 bytes
Isso cria o intervalo do mínimo da lista ao máximo da lista e descarta os elementos do intervalo que não estão presentes na lista original. Tecnicamente, esse é um tipo de caçamba , com caçambas muito pequenas. Não estou ciente de um nome para esta variante específica.
Experimente online!
Como funciona
fonte
Python,
4645 bytesClassificação de seleção simples.
fonte
l[:]
poderia ser1*l
Braquilog ,
127 bytesIsso usa o tipo de permutação, o que é obviamente terrível, mas ei, é mais curto que o Pyth!
Explicação
fonte
Haskell, 38 bytes
A função binária
%
insere um novo elementoh
em uma lista classificadat
, particionandot
em um prefixoa
de elementos<h
e um sufixob
de elementos>h
e ficah
entre eles.A operação
foldr(%)[]
então cria uma lista classificada de vazia, inserindo repetidamente elementos da lista de entrada.Esse é um byte menor que a implementação recursiva direta
Outra estratégia para 41 bytes:
fonte
%
como loop interno de inserção efoldr
para aplicá-lo como loop externo.JavaScript (ES6), 51 bytes
Cada loop encontra o menor número que não foi encontrado até o momento.
fonte
[1,2,3,4,5,4,3,2,1]
produz[1, 2, 3, 4, 5, Infinity, Infinity, Infinity, Infinity]
Python 2, 34 bytes
Recebe a entrada como um conjunto, imprimindo seus elementos em ordem crescente, terminando com erro.
Uma terminação limpa pode ser feita em 41 bytes:
ou
A entrada pode ser tomada como uma lista de 39 bytes ou 38 bytes no Python 3.5:
fonte
m=min(s)
/s - (m)
como loop interno para encontrar e remover o min dos elementos não classificados e a recursão como externa.Haskell,
424138 bytesPercorre todos os inteiros (assinado de 64 bits, na minha máquina) e mantém aqueles que estão em
u
. Claro que não termina em tempo razoável.A versão anterior repetiu com
[minimum u..maximum u]
o mesmo pior caso de tempo de execução.Edit: @xnor salvou um byte. Obrigado!
fonte
filter
é um menor:f u=filter(`elem`u)[minimum u..maximum u]
[minimum u..]
funciona por motivos de tipo?f [1,3,0]
, os elementos padrão para digitarInteger
que não estão vinculados, portanto o..
nunca termina. Se você precisar chamá-lo assimf ([1, 3, 0]::[Int])
, acho que a anotação de tipo deve ser incluída na contagem de bytes.Oracle SQL 11.2, 205 bytes
Sem golfe
Quanto ao método de classificação, não faço ideia,
ORDER BY
me esqueci.fonte
código de máquina x86-16 (BubbleSort int8_t),
2019 bytescódigo de máquina x86-64 / 32 (JumpDownSort)
2119 bytesChangelog:
Agradeço a @ ped7g pela ideia
lodsb
/cmp [si],al
e a juntar isso com um incremento / redefinição de ponteiro que eu estava olhando. Não precisamosal
/ah
vamos usar quase o mesmo código para números inteiros maiores.Novo algoritmo (mas relacionado), muitas alterações na implementação: O Bubbly SelectionSort permite uma implementação menor do x86-64 para bytes ou dwords; ponto de equilíbrio em x86-16 (bytes ou palavras). Também evita o erro no tamanho = 1 que meu BubbleSort possui. Ver abaixo.
Acontece que meu Bubbly Selection Sort com swaps toda vez que você encontra um novo min já é um algoritmo conhecido, JumpDown Sort. É mencionado em Bubble Sort: Uma Análise Algorítmica Arqueológica (ou seja, como o Bubble Sort se tornou popular apesar da sucção).
Classifica inteiros assinados de 8 bits no local . (Não assinado é do mesmo tamanho de código, basta alterar
jge
para ajae
). Duplicatas não são um problema. Trocamos usando uma rotação de 16 bits por 8 (com um destino de memória).O Bubble Sort é péssimo para desempenho , mas eu li que é um dos menores implementados em código de máquina. Isso parece especialmente verdadeiro quando há truques especiais para trocar elementos adjacentes. Essa é praticamente sua única vantagem, mas às vezes (em sistemas embarcados na vida real) é vantagem suficiente para usá-lo em listas muito curtas.
Omiti a rescisão antecipada sem trocas . Eu usei o loop BubbleSort "otimizado" da Wikipedia, que evita olhar os últimos
n − 1
itens durante a execução pelan
quinta vez, de modo que o contador de loop externo é o limite superior do loop interno.Listagem NASM (
nasm -l /dev/stdout
) ou fonte simplespush / pop
cx
ao redor do loop interno significa que ele roda comcx
= outer_cx até 0.Observe que
rol r/m16, imm8
não é uma instrução 8086, foi adicionada posteriormente (186 ou 286), mas isso não está tentando ser o código 8086, apenas x86 de 16 bits. Se o SSE4.1phminposuw
ajudasse, eu o usaria.Uma versão de 32 bits disso (ainda operando em números inteiros de 8 bits, mas com ponteiros / contadores de 32 bits) tem 20 bytes (prefixo do tamanho do operando ativado
rol word [esi-1], 8
)Bug: size = 1 é tratado como size = 65536, porque nada nos impede de entrar no fazer externo / enquanto com cx = 0. (Você normalmente usaria
jcxz
para isso.) Mas, felizmente, a Classificação JumpDown de 19 bytes tem 19 bytes e não tem esse problema.Versão original de 20 bytes x86-16 (sem a idéia de Ped7g). Omitido para economizar espaço, consulte o histórico de edições com uma descrição.
atuação
O armazenamento / recarregamento parcialmente sobreposto (na rotação do destino da memória) causa uma interrupção do encaminhamento de loja nas CPUs x86 modernas (exceto Atom em ordem). Quando um valor alto está subindo, essa latência extra faz parte de uma cadeia de dependência transportada por loop. Armazenar / recarregar é uma porcaria em primeiro lugar (como latência de encaminhamento de loja de 5 ciclos em Haswell), mas uma paralisação de encaminhamento leva a mais de 13 ciclos. A execução fora de ordem terá problemas para ocultar isso.
Consulte também: Estouro de pilha: classificação de bolha para classificar sequência de caracteres para uma versão disso com uma implementação semelhante, mas com uma saída antecipada quando não são necessários swaps. Ele usa
xchg al, ah
/mov [si], ax
para troca, que é 1 byte mais longo e causa uma parada parcial do registro em algumas CPUs. (Mas ainda pode ser melhor que a rotação da memória-dst, que precisa carregar o valor novamente). Meu comentário tem algumas sugestões ...Classificação JumpDown x86-64 / x86-32, 19 bytes (classifica int32_t)
É possível chamar de C usando a convenção de chamada do System V x86-64 como
int bubblyselectionsort_int32(int dummy, int *array, int dummy, unsigned long size);
(valor de retorno = max (matriz [])).Isso é https://en.wikipedia.org/wiki/Selection_sort , mas em vez de lembrar a posição do elemento min, troque o candidato atual na matriz . Depois de encontrar o mínimo (região não classificada), armazene-o no final da região classificada, como Classificação normal da seleção. Isso aumenta a região classificada em um. (No código,
rsi
aponta para um além do final da região classificada;lodsd
avança emov [rsi-4], eax
armazena o min novamente nela.)O nome Jump Down Sort é usado em Bubble Sort: An Aritological Algorithmic Analysis . Acho que minha classificação é realmente uma classificação Jump Up, porque os elementos altos saltam para cima, deixando a parte inferior classificada, não o fim.
Esse design de troca faz com que a parte não classificada da matriz acabe na ordem mais inversa, levando a muitos swaps posteriormente. (Como você começa com um candidato grande e continua vendo candidatos cada vez mais baixos, continua trocando). Eu o chamei de "borbulhante", mesmo que ele mova os elementos na outra direção. A maneira como ele move os elementos também é um pouco como um tipo de inserção para trás. Para assisti-lo em ação, use GDBs
display (int[12])buf
, defina um ponto de interrupção naloop
instrução interna e usec
(continuar). Pressione retornar para repetir. (O comando "display" faz com que o GDB imprima todo o estado da matriz toda vez que atingimos o ponto de interrupção).xchg
com mem tem umlock
prefixo implícito que torna isso mais lento. Provavelmente uma ordem de magnitude mais lenta que uma troca eficiente de carga / loja;xchg m,r
é um por taxa de transferência de 23c no Skylake, mas carregar / armazenar / mover com um registro tmp para uma troca eficiente (reg, mem) pode mudar um elemento por relógio. Pode ser uma proporção pior em uma CPU AMD em que aloop
instrução é rápida e não prejudica tanto o loop interno, mas as falhas de ramificação ainda serão um grande gargalo porque os swaps são comuns (e se tornam mais comuns à medida que a região não classificada fica menor) )O tamanho do código mesmo para
int8_t
: usolodsb
/scasb
,AL
e alterar o[rsi/rdi-4]
que-1
. O mesmo código de máquina funciona no modo de 32 bits para elementos de 8/32 bits. O modo de 16 bits para elementos de 8/16 bits precisa ser reconstruído com as compensações alteradas (e os modos de endereçamento de 16 bits usam uma codificação diferente). Mas ainda 19 bytes para todos.Evita a inicial
dec ecx
comparando com o elemento que acabou de carregar antes de prosseguir. Na última iteração do loop externo, ele carrega o último elemento, verifica se é menor que ele próprio e, em seguida, está pronto. Isso permite que ele funcione com tamanho = 1, onde meu BubbleSort falha (trata-o como tamanho = 65536).Testei esta versão (no GDB) usando o chamador deste: Experimente online! . Você pode executá-lo no TIO, mas é claro que não há depurador nem impressão. Ainda assim, o
_start
que o chama sai com exit-status = maior elemento = 99, para que você possa ver que funciona.fonte
cx
e useloop
para ambos? Talvez faça um loop para o outro lado, de trás para a frente da matriz, para contarmos um índice até zero? (E incrementebx
porque a parte classificada está no final em que você faz o loop).sub si, cx
como parte do loop externo usar um ponteiro em vez de indexar, mas não tinha pensado emlodsb
/cmp [si], al
. Eu estava considerandolodsw
/dec si
oulodsb
/xchg al,ah
para ainda configurado paracmp ah,al
cld
, ou acho que poderíamos fazer parte da convenção de chamada. AFAIK, terDF
limpado não é uma parte padrão das convenções de chamada de 16 bits, apenas 32/64. Ou será que você não pode assumi-lo em um gerenciador de inicialização? Mas com uma convenção de chamada de registro personalizada, isso é tanto um fragmento de código quanto uma função, com certeza, por que não exigir DF = 0. (E se nós queremos, ES = DS para que pudéssemosscasb
em vez delodsb
se isso é mais conveniente.)C, 72 bytes
Tipo de bolha. O primeiro argumento é um ponteiro para a matriz, o segundo argumento é o comprimento da matriz. Funciona com o gcc.
fonte
MATL ,
1110 bytesExame extremamente ineficiente de todas as permutações da entrada.
Experimente Online!
Explicação
fonte
Ruby, 40 bytes
Classificação de seleção. Função anônima; toma a lista como argumento.
fonte
Python, 120 bytes
Provavelmente, essa não será a resposta mais curta, mas acho que esse algoritmo pertence aqui. Se você ligar com uma lista de números inteiros, eles serão impressos de maneira classificada para stdout. Eu não tentaria isso com números muito grandes.
fonte
MIPS, 68 bytes
Eu escrevi uma implementação simples e não otimizada de classificação de bolhas há um tempo atrás. A contagem de bytes começa às
loop
e termina àsli $v0, 10
, assumindo que o endereço e o comprimento da lista já estejam na memória.Agora espero ser expulso da água com x86 ...
fonte
swapped=true
antecipada e a contagem regressiva com base no tamanho da matriz. Veja minha versão x86-16 de 20 bytes que classifica um número inteiro de 8 bits . Eu poderia criar uma versão x86 de 32 ou 64 bits normal que classifique números inteiros de 32 bits em algum momento, mas números inteiros de 8 bits no modo de 16 bits são um local ideal para o x86.Awk, 66 bytes
Matrizes no awk são como dicionários, não como matrizes C. Os índices podem ser não contíguos e aumentam (e são criados) conforme necessário. Então, criamos uma matriz
a
para a entrada, com cada linha sendo uma chave. E salvamos os valores mínimo e máximo. Em seguida, fazemos um loop de min a max e imprimimos todas as chaves existentesa
.b
é apenas para evitar o uso repetido de$0
.fonte
Python 3,
916247 bytesAgradecimentos a wnnmaw e Seeq pela ajuda no golfe.
O argumento
z
deve ser uma lista. Essa é uma variante da classificação de seleção.Não sei ao certo como se
min
comparabuilt-in sorting functions
, pois não tenho certeza de como o Python implementamin
. Felizmente, esta solução ainda está bem. Quaisquer sugestões de golfe nos comentários ou no chat PPCG são bem-vindas.fonte
def f(z):\nwhile z:m=min(z);z.remove(m);yield m
MATL , 11 bytes
Experimente online!
Isso é ordenado pelo seguinte procedimento, que é O ( n 2 ):
MATL é baseado em pilha. A matriz com os valores restantes é mantida no topo da pilha. Os valores removidos estão abaixo, em ordem. No final do programa, todos esses valores são exibidos. A matriz na parte superior também seria exibida, mas, como está vazia, não é exibida.
fonte
Pitão -
15131110 bytesDois bytes salvos graças ao @Jakube.
Bogosort.
Experimente online aqui .
Eu não preciso do
h
porque estamos garantidos sem duplicatas.fonte
Sério, 6 bytes
Experimente online!
Isso faz o mesmo que muitas outras respostas: gere todas as permutações, selecione o mínimo. Eu meio que esqueci que isso funcionaria enquanto eu estava trabalhando na solução abaixo.
Explicação:
Sério, 25 bytes (não concorrente)
Isso seria competitivo se não fosse por um erro no comando shuffle que eu consertei.
Experimente online! Isso implementa o melhor algoritmo de classificação de todos os tempos: Bogosort !
Explicação:
fonte
MATL,
1716 bytesSalvo um byte, criando um array nulo graças a @LuisMendo
Classificação de balde. Não tente com um intervalo maior que 2 31 -1.
Experimente online!
Explicação
TIL:
[]
e aumentá-la, assim como no MATLAB(
para indexação de atribuiçãoM
área de transferência automáticaNovo dia, novo TIL:
vertcat
magicamente cria uma matriz vazia quando não há nada na pilha para concatenarfonte
[]
pode ser substituída porv
. Isso ocorre porque o número padrão de entradas dev
é o número de elementos na pilhavertcat(STACK{:})
Julia,
2827 bytesExperimente online!
fonte
R, 68 bytes
Toma entradas
i
e saídas,o
que é a lista classificada.Explicação:
Evitar as permutações significa que pode classificar grandes listas com relativa rapidez. O "truque" é que subtrair o menor valor da entrada deixa um único 0 que determina o menor valor e a posição do menor valor.
fonte
Java 8,
11292 bytesAqui está outro tipo de seleção. A entrada é um número
List t
inteiro e a saída classificada é impressa na saída padrão.Atualizar
fonte
t
a existência de uma variável , o que o torna um trecho; exigimos que os envios sejam programas ou funções completos que utilizam nossos formatos de E / S padrão . Também exigimos que as importações levem em consideração a contagem de bytes. Deixe-me saber se você tiver alguma dúvida!Retina, 95
Classificação de bolha modificada. Eu suspeito que existem maneiras muito melhores de fazer isso, mesmo sem o tipo de retina embutido.
n
o dígito; largar os-
sinais.1
o dígito; adicionar1
a cada um, para que zero seja representado por1
.Experimente online.
fonte
Ruby, 22 bytes
Um tipo de permutação rápida . Executa no O (n!) Espaço e tempo.
fonte
Clojure,
7335 bytesBogosort :)
Versão anterior:
Reduz para uma lista classificada
r
, dividindo-a em partes "menores que eu" e "maiores que eu". Eu acho que esse é o tipo de inserção .fonte
recur
em uma função anônima. Também não sabiashuffle
.Ruby,
2624 bytesTipo de seleção, semelhante à resposta da Value Ink, mas usando uma abordagem diferente para aumentar a golfabilidade.
De acordo com a especificação: "A entrada / saída pode ser feita em qualquer método que você escolher, desde que seja legível por humanos". Eu acho que isso se encaixa na descrição, a saída é uma matriz de matrizes com um único elemento.
exemplo:
fonte
Java 7,
106104 bytesAqui está um bom tipo de bolha oleosa. O parâmetro de função é modificado no local para que eu não precise retornar nada. Ainda estou tentando espremer alguns bytes disso para que eu possa vencer o java lambda que alguém postou.
-1 byte graças a Geobits por apontar que a troca normal é melhor do que xor'ing
-1 byte graças a Leaky Nun por apontar que eu posso mover todas as declarações int para o loop for
Experimente online!
fonte
Ruby, 22 bytes
Cria uma matriz fora do intervalo entre os elementos mínimo e máximo da matriz de entrada. Retorna a interseção entre as duas matrizes.
fonte