import time

class Towers:
    
    def __init__(self, num = 3, progress = 2):
        self.num = num
        self.progress = progress
        self.tow = {}
        self.tow["A"] = [(num - i) for i in range(num)]
        self.tow["B"] = []
        self.tow["C"] = []
        self.errTXT = "No error"
        self.movTXT = "Initial towers (use %d lines terminal)\n" % (
            3 * (2 * num + 1) + 3,)

    def __call__(self):
        self.show()
        self.toh((self.num, "A", "B", "C"))

    def tot(self, t):
        return self.tow[t][len(self.tow[t])-1]

    def tail(self, t):
        x = self.tot(t)
        self.tow[t] = self.tow[t][:len(self.tow[t])-1]
        return x

    def valid(self, f, t):
        if self.tow[f]:
            if self.tow[t]:
                if self.tot(f) > self.tot(t):
                    self.errTXT = "Can not move %d on top of %d" % (
                        self.tot(f), self.tot(t))
                    return 0
                return 1
            return 1
        self.errTXT = "Can not move from empty tower " + f
        return 0
    
    def move(self, f, t):
        print "move from", f, "to", t
        if self.valid(f, t):
            self.movTXT = "Move %d from %s to %s\n" % (self.tot(f), f, t)
            self.tow[t].append(self.tail(f))
        else:
            raise ValueError, self.errTXT

    def show(self):
        print self.movTXT
        for i in ["A", "B", "C"]:
            print
            g = ["  "] * (self.num - 1) + [i + " "] + ["  "] * (self.num - 1)
            for j in self.tow[i]:
                for k in range(1, self.num + 1):
                    if j >= k:
                        g[self.num - k] += "** "
            for j in range(self.num) + range(self.num - 2, -1, -1):
                print g[j]
            print
        time.sleep(self.progress)

    def toh(self, (n, f, t, v)):
        if n == 1:
            self.move(f, t)
            self.show()
        else:
            self.toh((n - 1, f, v, t))
            self.move(f, t)
            self.show()
            self.toh((n - 1, v, t, f))


if __name__ == "__main__":
    
    import sys, string

    n = 3; t = 2
    try:
        n = string.atoi(sys.argv[1])
        t = string.atoi(sys.argv[2])
    except:
        pass

    towers = Towers(n, t)
    towers()
