# L-8 MCS 275 Fri 1 Feb 2008 : Towers of Hanoi
#
def write_piles(s,A,B,C):
   "writes contents of piles, after s"
   sA = '%s = %s' % (A[0],A[1])
   sB = '%s = %s' % (B[0],B[1])
   sC = '%s = %s' % (C[0],C[1])
   print s, sA, sB, sC

def write(k,m,n,A,B,C):
   "writes contents of piles"
   s = k*' '
   s = s + 'move %d, n = %d :' % (m,n)
   write_piles(s,A,B,C)

def Hanoi(n,A,B,C,k,m):
   """
   moves n disks from A to B, C is auxiliary
   k is recursion level, m counts # moves
   writes status of piles after each move
   returns the tuple (A,B,C,m)
   """
   #print  k*' ' + 'Hanoi n = %d, m = %d, k = %d' % (n,m,k)
   if n == 1:
      # move disk from A to B
      m = m + 1
      B[1].insert(0,A[1].pop(0))
      write(k,m,n,A,B,C)
   else:
      # move n-1 disks from A to C, B is auxiliary
      (A,C,B,m) = Hanoi(n-1,A,C,B,k+1,m)
      # move n-th disk from A to B
      m = m + 1
      B[1].insert(0,A[1].pop(0))
      write(k,m,n,A,B,C)
      # move n-1 disks from C to B, A is auxiliary
      (C,B,A,m) = Hanoi(n-1,C,B,A,k+1,m)
   return (A,B,C,m)

def main():
   """
   prompts user for the number of disks,
   initializes the stacks and calls Hanoi
   """
   n = input('Give number of disks : ')
   A = ('A',range(1,n+1))
   B = ('B',[])
   C = ('C',[])
   write_piles('at start :',A,B,C)
   m = 0
   (A,B,C,m) = Hanoi(n,A,B,C,0,0)
   #write_piles('  at end :',A,B,C)

main()
