A questão
Dado um conjunto de 9 números, m[]
que contém apenas os números 1 a 9 em uma ordem aleatória, sem dois números iguais, crie um programa em qualquer idioma que reorganize o número em ordem numérica (1, 2, 3, etc. etc.) alternando apenas dois números próximos um do outro (ou seja, 1, 3, 2 → 1, 2, 3).
Regras
- Você só pode modificar o aparelho trocando dois números que estão próximos um do outro
- Os números finais (1 a 9 em ordem) devem estar contidos em
m[]
- Você pode usar qualquer idioma que desejar
- A resposta com a menor quantidade de bytes ganha
Editar:
Seu código não não tem que imprimir a saída, mas a matriz rearranjada deve estar em m[]
.
code-golf
array-manipulation
sorting
Meow Mix
fonte
fonte
Respostas:
CJam, 15 bytes
Como funciona:
Experimente online aqui
fonte
Mathematica, 38 bytes
Essa é uma função sem nome que utiliza uma matriz, que aplica uma regra de substituição até que o padrão não possa mais ser encontrado. O padrão é uma lista que possui dois elementos consecutivos
b
ec
ondeb > c
, e a regra diz para trocar ob
e, dec
outra forma, deixar a matriz intocada.Há muito açúcar sintático aqui, mas o código é realmente muito legível se você conhece um pouco do Mathematica:
fonte
Python 3, 72 bytes
A abordagem bogosort (também conhecida como classificação estúpida): troca elementos vizinhos aleatoriamente até que a matriz seja classificada. Geralmente é executado em menos de um segundo.
2 bytes graças a @xnor.
fonte
Python 2, 45
Percorre a lista, classificando pares consecutivos de elementos. O índice
i
percorre0,1,2,3,4,5,6,7
oito vezes, o que garante que todos os elementos passem pela bolha e a lista é classificada.fonte
Pitão, 13 - 15 bytes
Solução que executa a troca solicitada e não produz saída:
Solução que executa a troca solicitada e imprime o estado intermediário da lista a cada etapa:
Solução que realiza a troca solicitada e imprime o estado final da lista:
Demonstração da solução do meio acima.
O método de troca de valores adjacentes é retirado da resposta de @ Jakube.
O programa usa
#
, o loop até a instrução de erro, para trocar um par adjacente de elementos mal ordenados até que não exista esse par; nesse pontoh
, a função head gera um erro, encerrando o programa.fonte
Retina ,
9593 bytesNão é particularmente competitivo (e provavelmente ainda jogável), mas aqui vamos nós ...
Onde
<empty>
deve haver uma linha vazia.Como todos os números são de um dígito, isso espera apenas uma sequência com todos os 9 dígitos como entrada e será impressa
123456789
após a classificação bem-sucedida. Cada estágio executa uma única troca e)1`
indica que todos, exceto o último, devem ser repetidos até que o resultado pare de mudar.O estágio vazio no final é necessário, porque, caso contrário, obteríamos resultados intermediários toda vez que o
98
estágio for processado.Aqui estão todos os resultados intermediários (sempre que isso muda) para um exemplo de execução:
(Eu obtive isso adicionando a
:
opção a cada estágio e me livrei de duplicatas consecutivas manualmente.)fonte
Pitão, 17 bytes
Trocar itens de uma lista é realmente caro em Pyth. Então, aqui está uma solução divertida, que estende um pouco as regras. Provavelmente não é válido.
Experimente online: Pyth Compiler / Executor
Explicação
Primeiro de tudo, a complexidade do tempo do meu código é
O(n^3)
. Mas essa não é a parte interessante. A pergunta não diz nada sobre a complexidade.A parte crítica é como eu alterno dois elementos na lista. Digamos que eu queira mudar os elementos
m[3]
em[4]
. Eu não me importo com os índices3
e4
nada. Eu simplesmente crio uma segunda lista, que substitui todos os elementos iguais aom[3]
númerom[4]
e todos os números iguais aom[4]
valorm[3]
. Como a lista não contém duplicatas, isso simula a troca desses dois valores. Se houvesse duplicatas, como na entrada[1, 3, 2, 2]
, a saída seria[1, 2, 3, 3]
. E se você der a entrada[1, 2, 1]
, ela terminará em um loop infinito. Não crio explicitamente a segunda lista, é apenas parte da implementação do método de conversão por Pyth. Se você imprimir as listas atuais ( veja aqui), fornece os valores corretos que você esperaria.fonte
JavaScript (ES6) 56
Uma função recursiva que reorganiza a lista fornecida no local.
Notas
Em JS, para qualquer valor numérico v: v> undefined == false, v <undefined == false. Portanto, sair dos limites da matriz não é um problema se usarmos a comparação correta
Quando a matriz finalmente é classificada, a função dentro de 'some' retorna false e a recursão termina
O valor retornado no caso de uma troca é uma matriz de 2 elementos e seu valor é sempre 'verdadeiro'. Isso funciona mesmo quando um ou mais elementos da matriz são 0
De fato, a função funciona com qualquer entrada numérica, não apenas dígitos únicos e não repetidos. Não encontrou uma maneira de tirar proveito dessa restrição de OP.
Teste usando o snippet (no Firefox) - a versão do snippet gera os valores atuais da lista em cada etapa.
fonte
Javascript ( ES6 ),
666153 bytesGraças à nova regra, posso reduzir ainda mais :)
Comentado
fonte
C, 183
Ainda não foi jogado, exceto por nomes de variáveis.
fonte
Haskell, 59 bytes
A função
s
coloca um elementoe
na frente ou no segundo lugar de uma lista, dependendo se é menor ou maior que o primeiro elemento da lista. Dobrars
na lista de entrada permite que o menor elemento borbulhe para a frente. Estou entrando em uma lista contendo uma única9
que removo imediatamente depoisinit
, para não precisar procurar listas vaziass
.iterate
repete o processo de dobra para sempre, criando uma lista de resultados intermediários. O resultado final é o nono elemento desta lista.fonte
Perl, 68 bytes
Código ungolfed
fonte