;;;-*- Mode:LISP; Package:USER; Base:10.; Readtable:ZL -*- ;;; From the "Dick Gabriel" Benchmark Series. ;;; Enhancements (C) Copyright 1983, Lisp Machine, Inc. ;;;BEGIN ;;;TRIANG (declare (special answer final)) ;(eval-when (compile load eval) ; (setq base 10. ibase 10.)) (defvar board nil) (defvar sequence nil) (defvar a nil) (defvar b nil) (defvar c nil) ;(defarray board fixnum 16.) ;(defarray sequence fixnum 14.) ;(defarray a fixnum 37.) ;(defarray b fixnum 37.) ;(defarray c fixnum 37.) (defun setup-triang () (setq board (make-array 16.)) (setq sequence (make-array 14.)) (setq a (make-array 37.)) (setq b (make-array 37.)) (setq c (make-array 37.)) (fillarray board '(1)) (setf (aref board 5) 0) (fillarray a '(1 2 4 3 5 6 1 3 6 2 5 4 11 12 13 7 8 4 4 7 11 8 12 13 6 10 15 9 14 13 13 14 15 9 10 6)) (fillarray b '(2 4 7 5 8 9 3 6 10 5 9 8 12 13 14 8 9 5 2 4 7 5 8 9 3 6 10 5 9 8 12 13 14 8 9 5)) (fillarray c '(4 7 11 8 12 13 6 10 15 9 14 13 13 14 15 9 10 6 1 2 4 3 5 6 1 3 6 2 5 4 11 12 13 7 8 4)) ) (defun last-position () (do ((i 1 (1+ i))) ((= i 16.) 0) (cond ((= 1 (aref board i)) (return i))))) (defun try (i depth) (cond ((= depth 14.) (let ((lp (last-position))) (cond ((member lp final)) (t (push lp final)))) (push (cdr (listarray sequence)) answer) t) ((and (= 1 (aref board (aref a i))) (= 1 (aref board (aref b i))) (= 0 (aref board (aref c i)))) (setf (aref board (aref a i)) 0) (setf (aref board (aref b i)) 0) (setf (aref board (aref c i)) 1) (setf (aref sequence depth) i) (do ((j 0 (1+ j)) (depth (1+ depth))) ((or (= j 36.) (try j depth)) ())) (setf (aref board (aref a i)) 1) (setf (aref board (aref b i)) 1) (setf (aref board (aref c i)) 0) ()))) ;(defun gogogo (i) ; (let ((answer ()) ; (final ())) ; (try i 1))) ;(include "timer.lsp") ;(timer timit ; (gogogo 22.)) (defun test () (let ((answer ()) (final ())) (try 22. 1) (= (length answer) 775.))) ;;;END ;;;;THIS MUST BE COMPILED WITH HARDEBECK COMPILER!!!!! (defun triang () (setup-triang) (progn (hw:write-microsecond-clock (hw:unboxed-constant 0)) (li:error "TRIANG complete." (test) (hw:read-microsecond-clock))) ;; Look in This error: A0 Result: A1 Time in Microseconds: A2 (loop))