mc #5425(2008/01/22 09:20 GMT) [ Common Lisp ] Rating1/1=1.00
see: Simulator for *Lisp language for Connection Machine, circa 1989.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
(defpackage :doukaku-126 (:use :cl :*lisp)) (in-package :doukaku-126) (*cold-boot :initial-dimensions '(10 10)) (defconstant +alive+ 1) (defconstant +dead+ 0) (defun grid10 (x y) (grid (mod x 10) (mod y 10))) (defun get-env (grid x y) (values (pref grid (grid x y)) (count +alive+ (list (pref grid (grid10 (1- x) (1- y))) (pref grid (grid10 x (1- y))) (pref grid (grid10 (1+ x) (1- y))) (pref grid (grid10 (1- x) y)) (pref grid (grid10 (1+ x) y)) (pref grid (grid10 (1- x) (1+ y))) (pref grid (grid10 x (1+ y))) (pref grid (grid10 (1+ x) (1+ y))))))) (defun gen-next (cur) (*let ((next +dead+)) (loop :for x :from 0 :to 9 :do (loop :for y :from 0 :to 9 :do (multiple-value-bind (self env) (get-env cur x y) (cond ((and (eql +dead+ self) (= 3 env)) (*setf (pref next (grid x y)) +alive+)) ((and (= +alive+ self) (<= 2 env 3)) (*setf (pref next (grid x y)) +alive+)) ('T (*setf (pref next (grid x y)) +dead+)))))) next)) ;; グライダーを作る (defun make-glider () (*let ((g +dead+)) (*setf (pref g (grid 1 0)) +alive+ (pref g (grid 0 1)) +alive+ (pref g (grid 0 2)) +alive+ (pref g (grid 1 2)) +alive+ (pref g (grid 2 2)) +alive+) g)) ;; 初期値をグライダーにしてループ (loop :for gen = (make-glider) then (gen-next gen) :do (ppp gen :mode :grid) :unless (y-or-n-p) :do (return))
Rating1/1=1.00-0+
[ reply ]
mc
#5425()
[
Common Lisp
]
Rating1/1=1.00
である*LISP(スターリスプ)のCommon Lisp用のシミュレータパッケージを
使用して書いてみました。
本来、処理をプロセッサノードに割り振って並列に計算するので、今回位の計算
ならば、一度にどかんと計算させて、ループは全く使わないのが*LISPの流儀
だと思うのですが、構文がみつけられなかったため、全く普通に直列な
書き方になっており、あまり意味がないことになっています…。
表示は、グリッドの内容を綺麗に表示するプリティプリンタが付いてくるので、
それを使ってみました。
動作は、AllegroとCLISPで確認しています。
(SBCL等では、ソースを修正しないと*LISPがコンパイルできないようです。)
ソースは参考ページからダウンロード可能でチュートリアル付きです。
;; 実行結果 (グライダー)
DIMENSION 0 (X) ----->
0 1 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
see: Simulator for *Lisp language for Connection Machine, circa 1989.
(defpackage :doukaku-126 (:use :cl :*lisp)) (in-package :doukaku-126) (*cold-boot :initial-dimensions '(10 10)) (defconstant +alive+ 1) (defconstant +dead+ 0) (defun grid10 (x y) (grid (mod x 10) (mod y 10))) (defun get-env (grid x y) (values (pref grid (grid x y)) (count +alive+ (list (pref grid (grid10 (1- x) (1- y))) (pref grid (grid10 x (1- y))) (pref grid (grid10 (1+ x) (1- y))) (pref grid (grid10 (1- x) y)) (pref grid (grid10 (1+ x) y)) (pref grid (grid10 (1- x) (1+ y))) (pref grid (grid10 x (1+ y))) (pref grid (grid10 (1+ x) (1+ y))))))) (defun gen-next (cur) (*let ((next +dead+)) (loop :for x :from 0 :to 9 :do (loop :for y :from 0 :to 9 :do (multiple-value-bind (self env) (get-env cur x y) (cond ((and (eql +dead+ self) (= 3 env)) (*setf (pref next (grid x y)) +alive+)) ((and (= +alive+ self) (<= 2 env 3)) (*setf (pref next (grid x y)) +alive+)) ('T (*setf (pref next (grid x y)) +dead+)))))) next)) ;; グライダーを作る (defun make-glider () (*let ((g +dead+)) (*setf (pref g (grid 1 0)) +alive+ (pref g (grid 0 1)) +alive+ (pref g (grid 0 2)) +alive+ (pref g (grid 1 2)) +alive+ (pref g (grid 2 2)) +alive+) g)) ;; 初期値をグライダーにしてループ (loop :for gen = (make-glider) then (gen-next gen) :do (ppp gen :mode :grid) :unless (y-or-n-p) :do (return))Rating1/1=1.00-0+
[ reply ]