; ANSI control sequences
(defun move-to (col row)
- (patom "\033[" row ";" col "H" nil)
+ (patom "\033[" row ";" col "H")
)
(defun clear ()
- (patom "\033[2J" nil)
+ (patom "\033[2J")
)
(defun display-string (x y str)
(defun display-stack (x y clear stack)
(cond ((= 0 clear)
- (cond (stack (progn
- (display-string x y (car stack))
- (display-stack x (1+ y) 0 (cdr stack))
- )
- )
+ (cond (stack
+ (display-string x y (car stack))
+ (display-stack x (1+ y) 0 (cdr stack))
+ )
)
)
- (t (progn
- (display-string x y " ")
- (display-stack x (1+ y) (1- clear) stack)
- )
- )
+ (t
+ (display-string x y " ")
+ (display-stack x (1+ y) (1- clear) stack)
+ )
)
)
; Display all of the stacks, spaced 20 columns apart
(defun display-stacks (x y stacks)
- (cond (stacks (progn
- (display-stack x 0 (stack-pos y (car stacks)) (car stacks))
- (display-stacks (+ x 20) y (cdr stacks)))
- )
+ (cond (stacks
+ (display-stack x 0 (stack-pos y (car stacks)) (car stacks))
+ (display-stacks (+ x 20) y (cdr stacks)))
)
)
; Move a piece from the top of one stack
; to the top of another
+(setq move-delay 100)
+
(defun move-piece (from to)
(let ((from-stack (nth stacks from))
(to-stack (nth stacks to))
(setq stacks (replace stacks from from-stack))
(setq stacks (replace stacks to to-stack))
(display)
- (delay 100)
+ (delay move-delay)
)
)
(defun _hanoi (n from to use)
(cond ((= 1 n)
- (progn
- (move-piece from to)
- nil)
+ (move-piece from to)
)
(t
- (progn
- (_hanoi (1- n) from use to)
- (_hanoi 1 from to use)
- (_hanoi (1- n) use to from)
- )
+ (_hanoi (1- n) from use to)
+ (_hanoi 1 from to use)
+ (_hanoi (1- n) use to from)
)
)
)
(setq len (reset-stacks))
(clear)
(_hanoi len 0 1 2)
- )
-
- ; Run many in a row to time them
-
-(defun hanois(n)
- (cond ((> n 0)
- (progn
- (hanoi)
- (hanois (1- n))
- )
- )
- )
+ (move-to 0 23)
+ t
)