Guest User

Untitled

a guest
May 24th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.49 KB | None | 0 0
  1. import time
  2.  
  3. print = (lambda p: lambda *args, **kwargs: [p(*args, **kwargs), time.sleep(.01)])(print)
  4.  
  5.  
  6. class Tower:
  7. def __init__(self, name, state):
  8. self.data = state
  9. self.name = name
  10.  
  11. def append(self, el):
  12. self.data.append(el)
  13.  
  14. def pop(self):
  15. return self.data.pop()
  16.  
  17. def can_put_on_top(self, el):
  18. if len(self.data) == 0:
  19. return True
  20. if self.data[-1] > el:
  21. return True
  22. return False
  23.  
  24. def __str__(self):
  25. return self.name + str(self.data)
  26.  
  27. def __len__(self):
  28. return len(self.data)
  29.  
  30.  
  31. from itertools import tee, permutations, product
  32. from copy import copy
  33. from random import shuffle
  34.  
  35.  
  36. def pprint(towers, tower_order):
  37. s = {tower.name: tower for tower in towers}
  38. ans = []
  39. for tower in tower_order:
  40. ans.append('{}'.format(s[tower]))
  41. print('\t\t'.join(ans))
  42.  
  43.  
  44. tower_a = Tower('left', [4,2,1,5])
  45. tower_b = Tower('middle', [])
  46. tower_c = Tower('right', [])
  47.  
  48. iteration = 0
  49.  
  50.  
  51. def hanoi(source, dest, storage, moves, level):
  52. global iteration
  53.  
  54. # print('moves:')
  55. # for move in moves:
  56. # print(':', move)
  57.  
  58. if len(source) == 0:
  59. # print('Its empty')
  60. return False
  61. mov = '{} {} {}'.format(tower_a, tower_b, tower_c)
  62. el = source.pop()
  63.  
  64. if dest.can_put_on_top(el):
  65.  
  66. dest.append(el)
  67. # check if won
  68. if '{} {} {}'.format(tower_a, tower_b, tower_c) in moves:
  69. source.append(dest.pop())
  70. # print('Already moved')
  71. return False
  72.  
  73. if len(tower_a) == 0 and len(tower_b) == 0:
  74.  
  75. print('-> ' * level, '{} -> {}'.format(source, dest))
  76. print('- WON -' * 10)
  77. print(tower_a, tower_b, tower_c)
  78. source.append(dest.pop())
  79. return True
  80. else:
  81. # move back
  82. source.append(el)
  83. # print('Cant put')
  84. return False
  85.  
  86. # if level == 20:
  87. # return True
  88.  
  89. moves.add(mov)
  90. print('-> ' * level, '{} -> {}'.format(source, dest))
  91. # print('Adding move:', mov)
  92. for s, d, st in permutations([source, dest, storage], 3):
  93. if '{} {} {}'.format(tower_a, tower_b, tower_c) in moves:
  94. continue
  95.  
  96. if hanoi(s, d, st, moves, level + 1):
  97.  
  98. source.append(dest.pop())
  99. print(tower_a, tower_b, tower_c)
  100. return True
  101. else:
  102. pass
  103. # print(False)
  104.  
  105. moves.remove(mov)
  106. source.append(dest.pop())
  107. return False
  108.  
  109.  
  110. hanoi(tower_a, tower_b, tower_c, set(), 0)
Add Comment
Please, Sign In to add comment