68 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			68 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | # -*- coding: utf-8 -*- | ||
|  | 
 | ||
|  | from collections import deque | ||
|  | from pyswip.prolog import Prolog | ||
|  | from pyswip.easy import getList, registerForeign | ||
|  | 
 | ||
|  | class Notifier: | ||
|  |     def __init__(self, fun): | ||
|  |         self.fun = fun | ||
|  |          | ||
|  |     def notify(self, t): | ||
|  |         #return not self.fun(getList(t)) | ||
|  |         return not self.fun(t) | ||
|  |     notify.arity = 1 | ||
|  |      | ||
|  | class Tower: | ||
|  |     def __init__(self, N=3, interactive=False): | ||
|  |         """N is the number of disks
 | ||
|  |         """
 | ||
|  |         self.N = N | ||
|  |         self.disks = dict(left=deque(range(N, 0, -1)), center=deque(), right=deque()) | ||
|  |         self.started = False | ||
|  |         self.interactive = interactive | ||
|  |         self.step = 0 | ||
|  |          | ||
|  |     def move(self, r): | ||
|  |         if not self.started: | ||
|  |             self.step += 1 | ||
|  |             self.draw() | ||
|  |             self.started = True | ||
|  |         disks = self.disks | ||
|  |         disks[str(r[1])].append(disks[str(r[0])].pop()) | ||
|  |         self.step += 1 | ||
|  |         return self.draw() | ||
|  |          | ||
|  |     def draw(self): | ||
|  |         disks = self.disks | ||
|  |         print "\n Step", self.step | ||
|  |         for i in range(self.N): | ||
|  |             n = self.N - i - 1 | ||
|  |             print " ", | ||
|  |             for pole in ["left", "center", "right"]: | ||
|  |                 if len(disks[pole]) - n > 0: | ||
|  |                     print disks[pole][n], | ||
|  |                 else: | ||
|  |                     print " ", | ||
|  |             print | ||
|  |         print "-"*9 | ||
|  |         print " ", "L", "C", "R"         | ||
|  |         if self.interactive: | ||
|  |             cont = raw_input("Press 'n' to finish: ") | ||
|  |             return cont.lower() == "n" | ||
|  |                      | ||
|  | 
 | ||
|  | def main(): | ||
|  |     N = 3 | ||
|  |     INTERACTIVITY = True | ||
|  |      | ||
|  |     prolog = Prolog() | ||
|  |     tower = Tower(N, INTERACTIVITY) | ||
|  |     notifier = Notifier(tower.move) | ||
|  |     registerForeign(notifier.notify) | ||
|  |     prolog.consult("hanoi.pl") | ||
|  |     list(prolog.query("hanoi(%d)" % N)) | ||
|  |      | ||
|  | if __name__ == "__main__": | ||
|  |     main() |