Digamos que eu tenha uma lista como [3, 0, 4, 2, 1]
, e eu uso a classificação de seleção para classificá-la, eu poderia visualizá-la assim:
3,0,4,2,1
|-|
0,3,4,2,1
|-----|
0,1,4,2,3
|-|
0,1,2,4,3
|-|
0,1,2,3,4
Esse desafio é visualizar a classificação como esta.
Entrada
Sua entrada será uma lista de números inteiros positivos, em qualquer formato que você desejar.
Tarefa
Seu envio deve classificar a lista de entrada trocando apenas dois elementos por vez e, a cada troca, o envio deve exibir a lista e um caractere sob cada um dos elementos que estão sendo trocados. Se um número que foi trocado tiver mais de um dígito, o caractere poderá estar em qualquer lugar abaixo dele. No final, o envio deve exibir a lista classificada.
Outras regras
- A classificação deve usar menos trocas que n 4 , onde n é o comprimento da lista.
- A classificação não precisa ser determinística.
- Os caracteres sob a troca podem ser qualquer caractere, exceto o espaço.
n^4
? Você está sendo um pouco generoso aqui.0
(correção por favor apenas o exemplo de modo a não respostas invalidar esta não pode lidar 0)Respostas:
Perl, 62 bytes
Inclui +3 para
-p
Dê entrada como uma única linha de números no STDIN:
Troca repetidamente a primeira inversão. A complexidade do swap é
O(n^2)
, a complexidade do tempo éO(n^3)
. Usa os números que estão sendo trocados como marca:visisort.pl
:O programa também suporta valores negativos e números de ponto flutuante
Se você insistir em um caractere de conexão, o código se tornará 66 bytes:
Mas agora ele não suporta números negativos e zero mais (mas o programa só precisa suportar números inteiros positivos de qualquer maneira. No
0
exemplo, é um erro)fonte
The characters under the swapped can be any char except space.
você não deve ter espaços entre número na linha de marca_
vários dígitos, o que significa claramente que você pode, por exemplo, colocar um sob o primeiro dígito, o que significa que todos os caracteres entre eles seriam espaços). Por isso, defendo minha interpretação (a menos que o OP discorde, é claro). Buit apenas para fazer você feliz Eu adicionei uma versão sem espaço também :-)JavaScript (ES6), 158 bytes
Tipo de bolha. Saída de amostra:
fonte
-
under,
e, em seguida, os dois|
s sempre estarão abaixo dos números adjacentes.PHP, 248 bytes
Vitórias chatas do Bubblesort
PHP, 266 bytes de uma maneira com array_slice e min
saída modificada em
I X
vez de*~~*
282 bytes
Como funciona
Procura o mínimo em uma matriz e leva-o na primeira posição. Procura o mínimo sem a primeira posição ... e assim por diante. Se um valor é o dobro, o primeiro valor será trocado.
Exemplo de saída
fonte
echo$t."\n";
, você pode usarecho"$t\n";
e salvar um byte.Haskell,
165164162 bytesIsso visualiza a classificação de seleção. Exemplo de uso:
Como funciona:
s % c
é uma função auxiliar que fazlength (show s) - 2
cópias do personagemc
. É usado para espaçamento antes de ambos|
, uma vezc == ' '
e outra vezc == '-'
.A função principal
#
pega uma listap
que é a parte classificada da lista ex
qual é a parte ainda a ser classificada. A correspondência de padrão(h,t:s)<-span(/=minimum x)x
divide a listax
em seu elemento mínimo e ligah
- se à parte antes do mínimo,t
ao mínimo em si es
à parte após o mínimo. O restante está formatando duas linhas: 1) a lista em seu estado atual (p++x
) e 2) a|----|
parte seguida por uma chamada recursiva de#
comt
anexado aep
a cabeça deh
inserida entre a cauda deh
es
.PS: funciona também com números negativos e / ou de ponto flutuante:
Edit: @BlackCap salvou 2 bytes. Obrigado!
fonte
id=<<[show$p++x,"\n ",[' '|p>[]],p%" ","|",h%"-",['|'|h>[]],"\n",(p++[t])#(drop 1h++take 1h++s)]
Python 2, 267 bytes
Também funciona com decimais e números negativos.
Exemplo:
fonte
JavaScript (ES6), 147
155Usar n * n compara, mas (acredito) o número mínimo de swaps. E as posições de swap são mais variáveis em comparação com o tipo de bolha chata.
Menos golfista e, com sorte, mais compreensível
Teste
fonte
Java 7,
256 241282 bytesObrigado a @Geobits e @Axelh por salvar 15 bytes
Ungolfed
saída
fonte
out
, você precisa colocar algo comoPrintStream out=System.out;
em algum lugar do seu código.out
, você deve usar um ternário em vez deif/else
imprimir nos dois ramos. Algo como, emout.print(a>b?a:b);
vez deif(a>b)out.print(a);else out.print(b);
if(j==i|j==m)out.print(a[j]);out.print(" ");
ou ainda melhor com um ternárioout.print((j==i|j==m?a[j]:" ")+" ");
e, em seguida, você pode remover {} do PS loop: Eu uso uma estática de importação para a instância para fora, se isso é ok;)System.
em frente àout
s), e está faltando o2
e3
nas duas últimas operações swap linhas.for(j=0;j<=m&i!=l-1;j++)
Gelatina , 36 bytes
Experimente online!
Explicação
O exemplo mostrado no link TIO é particularmente difícil para este programa; o
;0
próximo ao início é necessário para garantir que o loop termine exatamente no ponto em que a entrada é classificada. Normalmente, isso não é necessário (porque terminará após mais uma iteração), mas se a última troca for dos dois primeiros elementos (como visto aqui), a mais uma iteração não ocorrerá e impossibilitará a conclusão a lista de forma consistente. Como tal, precisamos garantir que não troquemos nada na última iteração do loop.fonte