Se non sai cos'è la Torre di Hanoi , te lo spiego brevemente: ci sono tre aste e alcuni dischi, ognuno dei quali ha dimensioni diverse. All'inizio tutti i dischi si trovano sulla prima torre, in ordine: il più grande è in fondo, il più piccolo in alto. L'obiettivo è portare tutti i dischi alla terza asta. Sembra facile? Ecco il problema: non è possibile posizionare un disco sopra un disco più piccolo dell'altro disco; puoi tenere solo un disco alla mano per spostarlo su un'altra asta e puoi posizionare il disco solo su aste, non sul tavolo, bastardo subdolo.
Esempio di soluzione ascii:
A B C
| | |
_|_ | |
__|__ | |
A B C
| | |
| | |
__|__ _|_ |
A B C
| | |
| | |
| _|_ __|__
A B C
| | |
| | _|_
| | __|__
Sfida
Ci sono tre aste chiamate A, B e C. (Puoi anche chiamarle 1,2 e 3 rispettosamente se questo aiuta) All'inizio tutti e n i dischi sono sull'asta A (1).
La tua sfida è verificare una soluzione per la torre di Hanoi. Dovrai assicurarti che:
- Alla fine tutti e n i dischi sono sull'asta C (3).
- Per ogni dato disco in qualsiasi dato stato non c'è un disco più piccolo sotto di esso.
- Nessun errore evidente come il tentativo di prendere i dischi da un'asta vuota o di spostare i dischi su aste inesistenti.
(la soluzione non deve essere ottimale.)
Ingresso
Il tuo programma riceverà due input:
- Il numero di dischi n (un numero intero)
Le mosse che sono prese, che consisterà in una serie di tuple di: (torre per prendere il disco attualmente più in alto da), (torre per prendere questo disco in) dove ogni tupla si riferisce a una mossa. Puoi scegliere come sono rappresentati. Ad esempio qualcosa come i seguenti modi di rappresentare la soluzione per n = 2 che ho disegnato in ASCII sopra. (Userò il primo nei casi di test, perché è facile per gli occhi):
"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]
Produzione
Sinceramente, se le condizioni che si possono trovare sotto "sfida" valgono.
Falsy, se non lo fanno.
Casi test:
Vero:
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 ° suggerito da @MartinEnder, 7 ° da @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"
Questo è code-golf , vince la soluzione più breve. Si applicano regole standard e scappatoie. Nessuna batteria inclusa.
A->A
?
moving discs to nonexistant rods.
quindi ovviamente sì, è aD
A=1
,B=2
,C=3
, etc.)?