Comment detail

ライフゲーム (Nested Flatten)
大分色物な感じですが、超並列計算機 Connection Machine用のLisp処理系
である*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 
 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))

Index

Feed

Other

Link

Pathtraq

loading...