Problema
Supongamos que tiene N pilas llamadas S 1 a S N , donde cada S k (k = 1 a N) contiene N copias del número k.
Por ejemplo, cuando N = 3 las pilas se ven así:
1 2 3 <- top of stack
1 2 3
1 2 3 <- bottom of stack
=======
1 2 3 <- stack index
Aquí hay 3 pilas indexadas como 1, 2 y 3, y cada una contiene N instancias de su propio índice.
El objetivo es reorganizar las N pilas de modo que cada una de ellas contenga idénticamente los números del 1 al N en orden de arriba a abajo.
Por ejemplo, para N = 3, el objetivo es reorganizar las pilas en:
1 1 1
2 2 2
3 3 3
=======
1 2 3
La única acción que puede realizar con las pilas es tomar el número superior de una de las pilas (estallar) e inmediatamente colocarlo encima de una pila diferente (empujar) . Esto está sujeto a estas estipulaciones:
Un número solo se puede insertar en una pila si es menor o igual que el número superior en esa pila.
por ejemplo, a
1
se puede empujar a una pila con a1
,2
o3
en la parte superior, pero a2
solo se puede empujar a una pila con a2
o3
(o más alto) en la parte superior.Esto tiene el efecto de que las pilas siempre están aumentando monotónicamente de arriba a abajo.
Se puede extraer cualquier pila no vacía y, suponiendo que se satisfaga la viñeta anterior, se puede empujar a cualquier pila.
Cualquier número puede ser empujado a una pila vacía.
Las pilas no tienen límite de altura máxima.
Las pilas no se pueden crear ni destruir, siempre hay N de ellas.
Este desafío se trata de decidir qué pops y empujes hacer para completar el intercambio de stack, no necesariamente en la menor cantidad de movimientos, sino de una manera segura.
(Practicar con una baraja de cartas es una buena manera de tener una idea del problema).
Reto
Escriba un programa o función que tome un entero positivo N, garantizado como 3 o superior. Imprima o devuelva una cadena que denote todas las acciones de empuje emergente necesarias para reorganizar las pilas desde el 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 caso)
Al 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 línea en su salida debe contener dos números separados por un espacio. El primer número es el índice de la pila a partir de la cual saltar y el segundo número es el índice de la pila a empujar. Realizar las acciones de todas las líneas en orden debe organizar las pilas correctamente sin romper ninguna regla.
Por ejemplo, aquí hay una salida válida potencial para el 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
Su salida no necesita ser óptima , solo correcta. es decir, no necesita minimizar la cantidad de pops y empujones.
- Por lo tanto, estaría bien si, por ejemplo, se hiciera algún movimiento repetidamente y se invirtiera de inmediato.
- Hacer estallar y empujar a la misma pila en un solo movimiento, por ejemplo
2 2
, también está permitido (aunque, por supuesto, no tiene sentido).
Su salida hace necesidad de ser determinista y finito.
Recuerde que las pilas tienen indexación basada en 1. La indexación basada en 0 no está permitida.
N mayor que 9, por supuesto, debería funcionar tan bien como un solo dígito N.
Si lo desea, puede usar dos caracteres ASCII imprimibles distintos que no sean dígitos en lugar de espacios y líneas nuevas. Una nueva línea final (o un sustituto de nueva línea) en la salida está bien.
Tanteo
El código más corto en bytes gana. Tiebreaker es la respuesta más votada.
Puntos brownie sin valor si puede mostrar que su algoritmo es óptimo.
-._(._.)_.-
N=3
óptimo?