troyjwatson

Hanoi.py

Mar 21st, 2015
531
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.36 KB | None | 0 0
  1.  
  2. '''                                                                                                                
  3. List comprehension solve of Hanoi puzzle
  4. by Troy J. Watson
  5. Sat Mar 21 11:31:24 AEDT 2015
  6. '''
  7.  
  8. class Hanoi(object):
  9.         def __init__(self, diskNum = 3, pole = 1, n = 8):
  10.         self.diskNum = diskNum
  11.         self.pole = pole
  12.         self.n = n
  13.         self.moves = 2**n-1
  14.         self.startup = 2**(self.diskNum-1)-1
  15.         self.blocksize = 2**diskNum
  16.         self.blocknum = (self.moves - self.startup) / self.blocksize
  17.         self.totalWithoutEnd = self.startup + (self.blocknum * self.blocksize)
  18.         self.leftover = self.moves - self.totalWithoutEnd
  19.         self.finalList = []
  20.    
  21.     def printData(self):
  22.         print 'moves ', self.moves
  23.         print 'startup ', self.startup
  24.         print 'blocksize ', self.blocksize
  25.         print 'blocknum ', self.blocknum
  26.         print 'totalwithoutend ', self.totalWithoutEnd
  27.         print 'leftover ', self.leftover
  28.  
  29.     def head(self):
  30.         self.pole = 1
  31.         self.finalList = self.finalList + [self.pole for x in xrange(self.startup)]
  32.         self.movePole()
  33.  
  34.     def isEven(self, num): return (num%2) == 0
  35.  
  36.     def movePole(self):
  37.         if (self.isEven(self.n)):
  38.             if (not(self.isEven(self.diskNum))):
  39.                 if (self.pole < 3): self.pole = self.pole + 1
  40.                 else: self.pole = 1
  41.             else:
  42.                 if (self.pole > 1): self.pole = self.pole -1
  43.                 else: self.pole = 3
  44.         else:
  45.             if (not(self.isEven(self.diskNum))):
  46.                 if (self.pole > 1): self.pole = self.pole -1
  47.                 else: self.pole = 3
  48.             else:
  49.                 if (self.pole < 3): self.pole = self.pole + 1
  50.                 else: self.pole = 1
  51.        
  52.     def body(self):
  53.         if (self.blocknum > 0):
  54.             for i in xrange(self.blocknum):
  55.                 self.finalList = self.finalList + [self.pole for x in xrange(self.blocksize)]
  56.                 self.movePole()
  57.            
  58.     def tail(self):
  59.         if (self.leftover > 0):
  60.             self.finalList = self.finalList + [self.pole for x in xrange(self.leftover)]   
  61.  
  62.     def calculate(self):
  63.         self.head()
  64.         self.body()
  65.         self.tail()
  66.         self.displayList()
  67.    
  68.     def displayList(self): print self.finalList
  69.  
  70. def main():
  71.     hanoi = Hanoi(1, 1, 5); print 'disk 1'; hanoi.calculate()
  72.     hanoi2 = Hanoi(2, 1, 5); print 'disk 2'; hanoi2.calculate()
  73.     hanoi3 = Hanoi(3, 1, 5); print 'disk 3'; hanoi3.calculate()
  74.     hanoi4 = Hanoi(4, 1, 5); print 'disk 4'; hanoi4.calculate()
  75.     hanoi5 = Hanoi(5, 1, 5); print 'disk 5'; hanoi5.calculate()
  76.     #print hanoi.printData()
  77.  
  78. if __name__ == '__main__':main()
Advertisement
Add Comment
Please, Sign In to add comment