シェルピンスキーのギャスケット

Wikipedia パスカルの三角形の記述に「パスカルの三角形の奇数のみを塗りつぶすと、シェルピンスキーのギャスケットの一部分が出現する」と言う説明がある。

;; x から max までのリストを作って返す。
;; (mk-list 1 10) ;=> (1 2 3 4 5 6 7 8 9 10)
(defun mk-list (x max)
 (if (= x max)
    (list max)
    (cons x (mk-list (+ x 1) max))))

;; リストの x 番目の要素を取得
(defun get-cell (x ls count)
  (cond
    ((null ls) nil)
    ((= x count) (car ls))
    (t (get-cell x (cdr ls) (+ count 1)))))

;; パスカルの三角形から x yを指定して要素を取得。
(defun read-pascal (ls x y)
   (get-cell x (get-cell y ls 1) 1))

;; 新しいパスカルの三角形の要素を x yを指定して取得。
(defun pascal (ls x y)
   (if (or (<= x 1) (<= y 1) (>= x y)) 1
       (+ (read-pascal ls (- x 1) (- y 1))
          (read-pascal ls x       (- y 1)))))

;; 1行を生成。
(defun pascal-line (ls n)
  (mapcar #'(lambda(x)(pascal ls x n)) (mk-list 1 n)))

;; パスカルの三角形を作成
(defun pascal-triangle (ls n cnt)
  (if (= n cnt) ls
    (pascal-triangle (append ls (list (pascal-line ls n))) (+ n 1) cnt)))

;; 偶数は " " 奇数は "X" に置き換える
(defun line-mark (ls)
  (mapcar #'(lambda(x)(if (zerop (mod x 2)) " " "X")) ls))

;; シェルピンスキーのギャスケット
(defun sierpinski (x)
  (mapcar 
    #'(lambda(ls)(format t "~{~A~}~%" (line-mark ls))) 
    (pascal-triangle '() 1 x)))

(sierpinski 65) ;;=>
X
XX
X X
XXXX
X   X
XX  XX
X X X X
XXXXXXXX
X       X
XX      XX
X X     X X
XXXX    XXXX
X   X   X   X
XX  XX  XX  XX
X X X X X X X X
XXXXXXXXXXXXXXXX
X               X
XX              XX
X X             X X
XXXX            XXXX
X   X           X   X
XX  XX          XX  XX
X X X X         X X X X
XXXXXXXX        XXXXXXXX
X       X       X       X
XX      XX      XX      XX
X X     X X     X X     X X
XXXX    XXXX    XXXX    XXXX
X   X   X   X   X   X   X   X
XX  XX  XX  XX  XX  XX  XX  XX
X X X X X X X X X X X X X X X X
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
X                               X
XX                              XX
X X                             X X
XXXX                            XXXX
X   X                           X   X
XX  XX                          XX  XX
X X X X                         X X X X
XXXXXXXX                        XXXXXXXX
X       X                       X       X
XX      XX                      XX      XX
X X     X X                     X X     X X
XXXX    XXXX                    XXXX    XXXX
X   X   X   X                   X   X   X   X
XX  XX  XX  XX                  XX  XX  XX  XX
X X X X X X X X                 X X X X X X X X
XXXXXXXXXXXXXXXX                XXXXXXXXXXXXXXXX
X               X               X               X
XX              XX              XX              XX
X X             X X             X X             X X
XXXX            XXXX            XXXX            XXXX
X   X           X   X           X   X           X   X
XX  XX          XX  XX          XX  XX          XX  XX
X X X X         X X X X         X X X X         X X X X
XXXXXXXX        XXXXXXXX        XXXXXXXX        XXXXXXXX
X       X       X       X       X       X       X       X
XX      XX      XX      XX      XX      XX      XX      XX
X X     X X     X X     X X     X X     X X     X X     X X
XXXX    XXXX    XXXX    XXXX    XXXX    XXXX    XXXX    XXXX
X   X   X   X   X   X   X   X   X   X   X   X   X   X   X   X
XX  XX  XX  XX  XX  XX  XX  XX  XX  XX  XX  XX  XX  XX  XX  XX
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
 NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
 NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
 NIL NIL NIL NIL NIL NIL NIL)