class Hanoi_Tower:
    
    def __init__(self, Disks):
        self.Disks = Disks
        self.N = len(Disks)
        self.D = dict()
        self.N0 = self.N*'- '
        self.Towers = 'ABC'
        for t in self.Towers: self.D[t] = list()
        self.D['A'] = [ d for d in Disks ]

    def move_disk(self, target, goal):
        t1 = self.D[target]
        t2 = self.D[goal]
        disk = t1.pop()
        t2.append(disk)
        self.D[target] = t1
        self.D[ goal ] = t2
        print('Move Disk %c from %c to %c' % (disk, target, goal))
        self.show()

    def show(self):
        print()
        for t in self.Towers:
            tower = ' '.join(self.D[t])
            if len(tower) == 1: tower = tower + ' '
            tower_H = tower + self.N0[len(tower):]
            print("Tower %c : %s" % (t, tower_H))
        print('='*30)

    def move(self, target = 'A', goal = 'B', aux = 'C', n = None):
        if n == 0: return
        elif n is None: n = self.N
        self.move(target, aux, goal, n-1)
        self.move_disk(target, goal)
        self.move(aux, goal, target, n-1)

HT = Hanoi_Tower('Xx*@Oo')
HT.show()
HT.move()
