Si no sabe qué es la Torre de Hanoi , lo explicaré brevemente: hay tres barras y algunos discos, cada uno de los cuales tiene un tamaño diferente. Al principio, todos los discos están en la primera torre, en orden: el más grande está en la parte inferior, el más pequeño en la parte superior. El objetivo es llevar todos los discos a la tercera barra. ¿Suena fácil? Aquí está el truco: no puede colocar un disco encima de un disco que sea más pequeño que el otro disco; solo puedes sostener un disco en tu mano a la vez para moverlos a otra barra y solo puedes colocar el disco en barras, no en la mesa, bastardo astuto.
Solución de ejemplo ASCII:
A B C
| | |
_|_ | |
__|__ | |
A B C
| | |
| | |
__|__ _|_ |
A B C
| | |
| | |
| _|_ __|__
A B C
| | |
| | _|_
| | __|__
Reto
Hay tres barras llamadas A, B y C. (También puede llamarlas 1,2 y 3 respectivamente si eso ayuda) Al principio, todos los n discos están en la barra A (1).
Su desafío es verificar una solución para la torre de hanoi. Deberá asegurarse de que:
- Al final, todos los n discos están en la barra C (3).
- Para cualquier disco dado en cualquier estado dado no hay un disco más pequeño debajo de él.
- No hay errores obvios como intentar sacar discos de una barra vacía o mover discos a barras no existentes.
(la solución no tiene que ser óptima).
Entrada
Su programa recibirá dos entradas:
- El número de discos n (un entero)
Los movimientos que se toman, que consistirán en un conjunto de tuplas de: (torre para tomar el disco más alto actualmente), (torre para llevar este disco) donde cada tupla se refiere a un movimiento. Puedes elegir cómo se representan. Por ejemplo, algo así como las siguientes formas de representar la solución para n = 2 que he dibujado en ascii arriba. (Usaré el primero en los casos de prueba, porque es fácil para la vista):
"A-> B; A-> C; B-> C"
[("A", "B"), ("A", "C"), ("B", "C")]
[(1,2), (1,3), (2,3)]
"ABACBC"
[1,2,1,3,2,3]
Salida
Verdad, si las condiciones que se pueden encontrar bajo "desafío" se mantienen.
Falsy, si no lo hacen.
Casos de prueba:
Cierto:
n=1, "A->C"
n=1, "A->B ; B->C"
n=2, "A->B ; A->C ; B->C"
n=2, "A->C ; C->B ; A->C ; B->C"
n=2, "A->C ; A->B ; C->B ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=4, "A->B ; A->C ; B->C ; A->B ; C->A ; C->B ; A->B ; A->C ; B->C ; B->A ; C->A ; B->C ; A->B ; A->C ; B->C"
Falso:
3 ° sugerido por @MartinEnder, 7 ° por @Joffan
n=1, "A->B"
n=1, "C->A"
n=2, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=2, "A->B ; A->C ; C->B"
n=2, "A->C ; A->B ; C->B ; B->A"
n=2, "A->C ; A->C"
n=3, "A->B ; A->D; A->C ; D->C ; A->C"
n=3, "A->C ; A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->B ; B->C ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; C->B"
n=4, "A->B ; A->C ; B->C ; A->B ; C->A ; C->B ; A->B ; A->C ; B->C ; B->A ; C->A ; B->C ; A->B ; A->C"
n=4, "A->B ; A->B ; A->B ; A->C ; B->C ; B->C ; B->C"
Este es el código de golf , la solución más corta gana. Se aplican reglas estándar y lagunas. No incluye pilas.
A->A
?
moving discs to nonexistant rods.
supuesto que sí, es unD
A=1
,B=2
,C=3
, etc.)?