def Hanoi(quantidade, origem="A", destino="B", auxiliar="C"):
    if quantidade == 1:
        print(f"{origem} → {destino}")
        return
    Hanoi(quantidade-1, origem, auxiliar, destino)
    print(f"{origem} → {destino}")
    Hanoi(quantidade-1, auxiliar, destino, origem)

def Hanoi_passos(quantidade, origem="A", destino="B", auxiliar="C", passo=1):
    if quantidade == 1:
        print(f"{passo}. {origem} → {destino}")
        return passo+1
    passo = Hanoi_passos(quantidade-1, origem, auxiliar, destino, passo)
    print(f"{passo}. {origem} → {destino}")
    passo = Hanoi_passos(quantidade-1, auxiliar, destino, origem, passo+1)
    return passo

def Hanoi_explicado(quantidade, origem="A", destino="B", auxiliar="C", prof=0):
    print(f"{'-'*prof}{'' if prof==0 else ' '}{'Q' if prof == 0 else 'então, primeiro q'}uero mover {quantidade} disco{'s' if quantidade > 1 else ''} de {origem} para {destino}")
    if quantidade == 1:
        print(f"{'-'*prof} Fácil! mova o disco no topo de {origem} para {destino} e fim.")
        return
    Hanoi_explicado(quantidade-1, origem, auxiliar, destino, prof+1)
    print(f"{'-'*prof}{'' if prof==0 else ' '}Agora mova o disco no topo de {origem} para {destino}")
    Hanoi_explicado(quantidade-1, auxiliar, destino, origem, prof+1)
    print(f"{'-'*prof}{'' if prof==0 else ' '}Movi {quantidade} discos de {origem} para {destino}!")

def imprime_Hanoi(pinos):
    L = max(len(str(x)) for x in pinos.keys())
    print()
    for pino, discos in pinos.items():
        if discos:
            x = f"{' '.join([f'{a}cm' for a in discos])}"
        else:
            x = '-'
        print(f"{pino:>{L}}: {x}")
    
def jogar_Hanoi(discos):
    pinos = {'Origem':list(range(discos,0,-1)),
             'Destino':[],
             "Auxiliar":[]}
    while True:
        imprime_Hanoi(pinos)
        if pinos["Origem"] == pinos["Auxiliar"] == []:
            print("Ganhou!")
            return
        if len(pinos["Origem"]) == 1 and len(pinos["Destino"]) == 0:
            print("★!")
        while True:
            de = input("\nMover de: ")
            if de.lower().startswith('o'):
                de = 'Origem'
            if de.lower().startswith('a'):
                de = 'Auxiliar'
            if de.lower().startswith('d'):
                de = 'Destino'
            para = input("Mover para: ")
            if para.lower().startswith('o'):
                para = 'Origem'
            if para.lower().startswith('a'):
                para = 'Auxiliar'
            if para.lower().startswith('d'):
                para = 'Destino'
            if de not in pinos.keys() or para not in pinos.keys() or len(pinos[de]) == 0 or (len(pinos[para]) > 0 and pinos[para][-1] < pinos[de][-1]):
                print("Movimento ilegal!")
            else:
                break
        pinos[para].append(pinos[de].pop())
