Problema
Digamos que você tenha N pilhas denominadas S 1 a S N , onde cada S k (k = 1 a N) contém N cópias do número k.
Por exemplo, quando N = 3, as pilhas ficam assim:
1 2 3 <- top of stack
1 2 3
1 2 3 <- bottom of stack
=======
1 2 3 <- stack index
Aqui existem 3 pilhas indexadas como 1, 2 e 3, e cada uma contém N instâncias de seu próprio índice.
O objetivo é reorganizar as pilhas N, de modo que cada uma delas contenha os números de 1 a N de maneira idêntica, de cima para baixo.
por exemplo, para N = 3, o objetivo é reorganizar as pilhas em:
1 1 1
2 2 2
3 3 3
=======
1 2 3
A única ação que você pode executar com as pilhas é pegar o número superior de uma das pilhas (estourar) e colocá-lo imediatamente no topo de uma pilha diferente (empurrar) . Isso está sujeito a estas estipulações:
Um número só pode ser enviado para uma pilha se for menor ou igual ao número superior nessa pilha.
por exemplo, a
1
pode ser empurrada para uma pilha com a1
,2
ou3
no topo, mas a2
só pode ser empurrada para uma pilha com a2
ou3
(ou superior) na parte superior.Isso tem o efeito de que as pilhas sempre aumentam monotonicamente de cima para baixo.
Qualquer pilha não vazia pode ser removida e, assumindo que o marcador anterior seja satisfeito, qualquer pilha pode ser enviada para.
Qualquer número pode ser colocado em uma pilha vazia.
As pilhas não têm limite de altura máximo.
Pilhas não podem ser criadas ou destruídas, sempre há N delas.
Esse desafio é decidir o que faz o pop e o push a fim de concluir a troca de stacks, não necessariamente com o menor número de jogadas, mas de uma maneira infalível.
(Praticar com um baralho de cartas é uma boa maneira de entender o problema.)
Desafio
Escreva um programa ou função que receba um número inteiro positivo N, com garantia de 3 ou superior. Imprima ou retorne uma sequência que denota todas as ações de envio rápido necessárias para reorganizar as pilhas a partir do estado inicial:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
=============
1 2 3 4 5
(N = 5 casos)
Para o estado final:
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
=============
1 2 3 4 5
Cada linha na sua saída deve conter dois números separados por um espaço. O primeiro número é o índice da pilha para a qual sair e o segundo número é o índice da pilha para a qual empurrar. A execução das ações de todas as linhas em ordem deve organizar as pilhas corretamente, sem violar nenhuma regra.
Por exemplo, aqui está uma saída potencial válida para o caso N = 3:
1 2 [move the top number on stack 1 to the top of stack 2]
1 2 [repeat]
1 2 [repeat]
3 1 [move the top number on stack 3 to the top of stack 1]
2 3 [etc.]
2 3
2 3
2 1
2 1
2 1
3 1
3 1
3 1
3 2
1 2
1 2
1 2
1 3
2 3
2 3
2 3
1 2
3 2
3 1
Notas
Sua saída não precisa ser ótima , apenas correta. ou seja, você não precisa minimizar o número de pops e pushs.
- Por isso, tudo bem se, digamos, alguma ação fosse repetida e imediatamente revertida.
- Saltar e empurrar para a mesma pilha em um movimento, por exemplo
2 2
, também é permitido (embora, obviamente, sem sentido).
Sua saída faz necessidade de ser determinista e finito.
Lembre-se de que as pilhas têm indexação baseada em 1. A indexação baseada em 0 não é permitida.
N maior que 9 deve, obviamente, funcionar tão bem quanto um dígito N.
Se desejar, você pode usar dois caracteres ASCII imprimíveis e sem dígito, em vez de espaços e novas linhas. Uma nova linha à direita (ou substituta da nova linha) na saída está correta.
Pontuação
O código mais curto em bytes vence. O desempatador é a resposta votada mais alta.
Brownie sem valor aponta se você pode mostrar que seu algoritmo é ideal.
-._(._.)_.-
N=3
ideal?