;;;-*-mode:lisp;package:bench-triang;base:10; source->source-optimizations:(t cspecials) -*-
;;; 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.))

(defarray board fixnum 16.)
(defarray sequence fixnum 14.)
(defarray a fixnum 37.)
(defarray b fixnum 37.)
(defarray c fixnum 37.)

(fillarray board '(1))
(setf (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 (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 (board (a i)))
		   (= 1 (board (b i)))
		   (= 0 (board (c i))))
	      (setf (board (a i)) 0)
	      (setf (board (b i)) 0)
	      (setf (board (c i)) 1)
	      (setf (sequence depth) i)
	      (do ((j 0 (1+ j))
		   (depth (1+ depth)))
		  ((or (= j 36.)
		       (try j depth)) ()))
	      (setf (board (a i)) 1)
	      (setf (board (b i)) 1)
	      (setf (board (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

