Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.71 KB | None | 0 0
  1. from collections import namedtuple
  2. from collections import UserList
  3.  
  4. # Total moves is 2**N-1 where N is the tower height
  5.  
  6. class HanoiTower:
  7.    
  8.     Disk = namedtuple('Disk', ['size'])
  9.    
  10.     class Tower(UserList):
  11.         def __init__(self, data=[], *, name):
  12.             self.data = data
  13.             self.name = name
  14.    
  15.     def __init__(self, quantity: int=3):
  16.         init_tower = [self.Disk(i) for i in range(quantity, 0, -1)]
  17.         self.left = self.Tower(init_tower, name='A')
  18.         self.mid = self.Tower(name='B')
  19.         self.right = self.Tower(name='C')
  20.         self.quantity = quantity
  21.         self.history = []
  22.         self.solved = False
  23.  
  24.     def solve(self):
  25.         if not self.solved:
  26.             self._move_tower(self.quantity,
  27.                              self.left,
  28.                              self.right,
  29.                              self.mid)
  30.             self.solved = True
  31.    
  32.     def _move_tower(self,
  33.                     height: int,
  34.                     source: list,
  35.                     dest: list,
  36.                     mid: list):
  37.         if height == 1:
  38.             disk = source.pop()
  39.             dest.append(disk)
  40.             record = f"Move {disk} from {source.name} to {dest.name}"
  41.             self.history.append(record)
  42.         else:
  43.             self._move_tower(height - 1, source, mid, dest)
  44.             self._move_tower(1, source, dest, mid)
  45.             self._move_tower(height - 1, mid, dest, source)
  46.    
  47.     def print_history(self):
  48.         for line in self.history:
  49.             print(line)
  50.         print(f"Total moves: {len(self.history)}")
  51.    
  52. if __name__ == '__main__':
  53.     tower = HanoiTower(10)
  54.     tower.solve()
  55.     tower.print_history()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement