A classificação não faz sentido para uma matriz bidimensional ... ou faz?
Sua tarefa é pegar uma grade de entrada e aplicar um algoritmo do tipo bolha até que todos os valores na grade não diminuam da esquerda para a direita e de cima para baixo ao longo de cada linha e coluna.
O algoritmo funciona da seguinte maneira:
- Cada passagem vai linha por linha, de cima para baixo, comparando / trocando cada célula com seus vizinhos direito e abaixo.
- se a célula for maior que apenas uma de suas vizinhas direita e abaixo, troque pela célula que é maior que
- se a célula for maior que seus vizinhos direito e abaixo, troque com o vizinho menor
- se a célula for maior que seus vizinhos direito e abaixo, que têm o mesmo valor, troque com o vizinho abaixo.
- se a célula não for maior que qualquer um dos seus vizinhos direitos e abaixo, não faça nada
- Continue até que nenhuma troca seja feita durante todo o passe. Será quando todas as linhas e colunas estiverem em ordem, da esquerda para a direita e de cima para baixo.
Exemplo
4 2 1
3 3 5
7 2 1
A primeira linha do passe trocará o 4 e o 2, depois o 4 pelo 1.
2 1 4
3 3 5
7 2 1
Quando chegarmos ao meio 3, ele será trocado pelo 2 abaixo
2 1 4
3 2 5
7 3 1
Em seguida, o 5 é trocado pelo 1 abaixo
2 1 4
3 2 1
7 3 5
A última linha da primeira passagem move os 7 para a direita
2 1 4
3 2 1
3 5 7
Então voltamos à linha superior novamente
1 2 1
3 2 4
3 5 7
E continue linha por linha ...
1 2 1
2 3 4
3 5 7
... até que a grade seja "classificada"
1 1 2
2 3 4
3 5 7
Outro exemplo
3 1 1
1 1 1
1 8 9
torna-se
1 1 1
1 1 1
3 8 9
ao invés de
1 1 1
1 1 3
1 8 9
porque a troca descendente tem prioridade quando os vizinhos direito e abaixo de uma célula são iguais.
Uma implementação de referência passo a passo pode ser encontrada aqui .
Casos de teste
5 3 2 6 7 3 1 0
3 2 1 9 9 8 3 0
3 2 2 8 9 8 7 6
torna-se
0 0 1 1 2 2 3 6
2 2 3 3 6 7 8 8
3 3 5 7 8 9 9 9
2 1 2 7 8 2 1 0
2 2 2 2 3 2 1 0
1 2 3 4 5 4 3 2
9 8 7 6 5 4 3 6
6 5 4 3 2 2 1 0
torna-se
0 0 0 1 1 1 2 2
1 1 2 2 2 2 2 2
2 2 2 2 3 3 3 3
3 4 4 4 4 5 6 6
5 5 6 7 7 8 8 9
Regras
- Você pode pegar a grade de entrada em qualquer formato conveniente
- Você pode assumir que os valores da grade são todos números inteiros não negativos no intervalo de 16 bits não assinado (0-65535).
- Você pode assumir que a grade é um retângulo perfeito e não uma matriz irregular. A grade será pelo menos 2x2.
- Se você usar outro algoritmo de classificação, deverá fornecer uma prova de que ele sempre produzirá a mesma ordem resultante que essa marca específica de classificação de bolhas 2D, independentemente da entrada. Eu espero que isso seja uma prova não trivial, então você provavelmente está melhor usando o algoritmo descrito.
Golfe feliz!
Respostas:
JavaScript (Node.js) , 129 bytes
Experimente online!
fonte
APL (Dyalog Unicode) , SBCS de 75 bytes
Obrigado a @ Adám por salvar 11 bytes.
Experimente online!
fonte
Wolfram Language (Mathematica) , 183 bytes
Experimente online!
Não sou especialista em Mathematica, tenho certeza que isso pode ser feito mais curto. Particularmente, acho que a declaração if dupla poderia ser reduzida usando,
Transpose
mas não sei como.fonte
R ,
169165144132 bytesExperimente online!
fonte
Limpo , 240 bytes
Experimente online!
Implementa o algoritmo exatamente como descrito.
O link inclui a análise de entrada para obter o formato na pergunta.
fonte
Python 2 ,
215208 bytesExperimente online!
-7 bytes, graças a ovs
fonte
C # (.NET Core) , 310 bytes
Sem LINQ. Usa usando System.Collections.Generic apenas para formatar a saída após o retorno da função. A coisa é enorme e estúpida. Ansioso para os golfe!
Experimente online!
fonte
Python 2 , 198 bytes
Experimente online!
Desenvolvido independentemente da resposta do TFeld, tem algumas diferenças.
fonte
Carvão , 118 bytes
Experimente online! Link é a versão detalhada do código. Também gastei alguns bytes em uma formatação mais bonita. Explicação:
O JavaScript tem a propriedade conveniente que
a[i]>a[i+1]
é falsa sei
for o último elemento da matriz. Para imitar isso em Charcoal, calculo umnan
lançando9.e999
para flutuar e subtraindo-o de si mesmo. (O carvão vegetal não suporta constantes de flutuação exponencial.) Em seguida, preencho a matriz original à direita com onan
e também adiciono uma linha adicional contendo apenas onan
. (A indexação cíclica do carvão vegetal significa que eu só preciso de um elemento nessa linha.)Loop para cada elemento na matriz. Isso deve ser loops mais do que suficientes para fazer o trabalho, pois também estou incluindo todos os
nan
s extras .Faça um loop sobre cada índice de linha e obtenha a linha nesse índice. (O carvão vegetal pode fazer as duas coisas com uma expressão, mas não com um comando.) Isso inclui a linha fictícia, mas isso não é um problema, porque todas as comparações falharão.
Faça um loop sobre o índice de cada coluna e obtenha o valor nesse índice. Novamente, isso fará um loop sobre os valores fictícios, mas as comparações falharão novamente.
Obtenha também os valores à direita e abaixo.
Se a célula for maior que o valor abaixo e não for verdade que o valor abaixo é maior que o valor à direita, troque a célula pelo valor abaixo.
Caso contrário, se a célula for maior que o valor à direita, troque-os.
Remova os
nan
valores e formate a matriz para saída implícita.fonte
Kotlin , 325 bytes
Experimente online!
fonte