home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
misc
/
volume1
/
8707
/
49
/
puzzle.cl
< prev
next >
Wrap
Lisp/Scheme
|
1990-07-13
|
4KB
|
164 lines
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 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))