home *** CD-ROM | disk | FTP | other *** search
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; File: puzzle.cl
- ; Description: PUZZLE benchmark
- ; Author: Richard Gabriel, after Forrest Baskett
- ; Created: 12-Apr-85
- ; Modified: 12-Apr-85 14:20:23 (Bob Shaw)
- ; Language: Common Lisp
- ; Package: User
- ; Status: Public Domain
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- ;;; PUZZLE -- Forest Baskett's Puzzle benchmark, originally written in Pascal.
-
- (eval-when (compile load eval)
- (defconstant size 511)
- (defconstant classmax 3)
- (defconstant typemax 12)
- )
-
- (defvar *iii* 0)
- (defvar *kount* 0)
- (defvar *d* 8)
-
- (defvar *piececount* (make-array (1+ classmax) :initial-element 0))
- (defvar *class* (make-array (1+ typemax) :initial-element 0))
- (defvar *piecemax* (make-array (1+ typemax) :initial-element 0))
- (defvar *puzzle* (make-array (1+ size)))
- (defvar *p* (make-array (list (1+ typemax) (1+ size))))
-
- (proclaim '(type fixnum *iii* *kount* *d*))
- (proclaim '(type vector *piececount* *class* *piecemax* *puzzle*))
-
- (defun fit (i j)
- (declare (fixnum i j))
- (let ((end (aref *piecemax* i)))
- (do ((k 0 (1+ k)))
- ((> k end) t)
- (declare (fixnum k))
- (cond ((aref *p* i k)
- (cond ((aref *puzzle* (+ j k))
- (return nil))))))))
-
- (defun place (i j)
- (let ((end (aref *piecemax* i)))
- (do ((k 0 (1+ k)))
- ((> k end))
- (declare (fixnum k))
- (cond ((aref *p* i k)
- (setf (aref *puzzle* (+ j k)) t))))
- (decf (aref *piececount* (aref *class* i)))
- (do ((k j (1+ k)))
- ((> k size)
- ; (terpri)
- ; (princ "*Puzzle* filled")
- 0)
- (declare (fixnum k))
- (cond ((not (aref *puzzle* k))
- (return k))))))
-
- (defun puzzle-remove (i j)
- (declare (fixnum i j))
- (let ((end (aref *piecemax* i)))
- (declare (fixnum end))
- (do ((k 0 (1+ k)))
- ((> k end))
- (declare (fixnum k))
- (cond ((aref *p* i k)
- (setf (aref *puzzle* (+ j k)) nil))))
- (incf (aref *piececount* (aref *class* i)))))
-
- (defun trial (j)
- (declare (fixnum j))
- (let ((k 0))
- (declare (fixnum k))
- (do ((i 0 (1+ i)))
- ((> i typemax) (setq *kount* (1+ *kount*)) nil)
- (declare (fixnum i))
- (cond ((not (= (aref *piececount* (aref *class* i)) 0))
- (cond ((fit i j)
- (setq k (place i j))
- (cond ((or (trial k)
- (= k 0))
- ; (format t "~%Piece ~4D at ~4D." (+ i 1) (+ k 1))
- (incf *kount*)
- (return t))
- (t (puzzle-remove i j))))))))))
-
- (defun definepiece (iclass ii jj kk)
- (declare (fixnum iclass ii jj kk))
- (let ((index 0))
- (declare (fixnum index))
- (do ((i 0 (1+ i)))
- ((> i ii))
- (declare (fixnum i))
- (do ((j 0 (1+ j)))
- ((> j jj))
- (declare (fixnum j))
- (do ((k 0 (1+ k)))
- ((> k kk))
- (declare (fixnum k))
- (setq index (+ i (* *d* (+ j (* *d* k)))))
- (setf (aref *p* *iii* index) t))))
- (setf (aref *class* *iii*) iclass)
- (setf (aref *piecemax* *iii*) index)
- (cond ((not (= *iii* typemax))
- (incf *iii*)))))
-
- (defun start ()
- (do ((m 0 (1+ m)))
- ((> m size))
- (declare (fixnum m))
- (setf (aref *puzzle* m) t))
- (do ((i 1 (1+ i)))
- ((> i 5))
- (declare (fixnum i))
- (do ((j 1 (1+ j)))
- ((> j 5))
- (declare (fixnum j))
- (do ((k 1 (1+ k)))
- ((> k 5))
- (declare (fixnum k))
- (setf (aref *puzzle* (+ i (* *d* (+ j (* *d* k))))) nil))))
- (do ((i 0 (1+ i)))
- ((> i typemax))
- (declare (fixnum i))
- (do ((m 0 (1+ m)))
- ((> m size))
- (declare (fixnum m))
- (setf (aref *p* i m) nil)))
- (setq *iii* 0)
- (definePiece 0 3 1 0)
- (definePiece 0 1 0 3)
- (definePiece 0 0 3 1)
- (definePiece 0 1 3 0)
- (definePiece 0 3 0 1)
- (definePiece 0 0 1 3)
-
- (definePiece 1 2 0 0)
- (definePiece 1 0 2 0)
- (definePiece 1 0 0 2)
-
- (definePiece 2 1 1 0)
- (definePiece 2 1 0 1)
- (definePiece 2 0 1 1)
- Bas (definePiece 3 1 1 1)
-
- (setf (aref *piececount* 0) 13)
- (setf (aref *piececount* 1) 3)
- (setf (aref *piececount* 2) 1)
- (setf (aref *piececount* 3) 1)
- (let ((m (+ 1 (* *d* (1+ *d*))))
- (n 0)
- (*kount* 0))
- (declare (fixnum m n))
- (cond ((fit 0 m) (setq n (place 0 m)))
- (t (format t "~%Error.")))
- (cond ((trial n)
- (format t "~%Success in ~S trials." *kount*))
- (t (format t "~%Failure.")))))
-
- ;;; call: (start)
-
- (run-benchmark "Puzzle" '(start))
-