Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-02-10

Getting Started in *LISP (4)

| 08:49 | Getting Started in *LISP (4) - わだばLisperになる を含むブックマーク はてなブックマーク - Getting Started in *LISP (4) - わだばLisperになる

*LISPのチュートリアルをさらってみることの4回目。

大分間があいてしまいました‥。

特に理由はないけれどこのチュートリアルは終らせたいところ。

1.2.3 Defining a More Complex Automaton

の続きで、One Small Step...for 9 Life

(defun one-step ()
  (*let ((count (neighbor-count)))
    (cond!!
      ;; 周囲の数が<1か、>3なら、1を引く
      ((or!! (<!! count 1) (>!! count 3))
       (if!! (zerop!! *automata-grid*)
	     *automata-grid*
	     (1-!! *automata-grid*)))

      ;; 2か、3なら1を足す
      ((<=!! 2 count 3) (1+!! *automata-grid*))

      ;; その他は、そのまま
      (t *automata-grid*))))

オートマトンの状態を一段階ずつ進める関数を定義

cond!!と、if!!は、pvarそれぞれを判定して結果を返す、SIMD版condとif

他にも色々ユーティリティを定義

(defun set-cells (cell-list value)
  (dolist (cell cell-list)
    (set-cell (car cell) (cadr cell) value)))

(defun init ()
  (set-grid 0)
  (set-cells '((2 2) (3 1) (3 2) (3 3) (4 1))
	     1)
  (view))

(defun view-step (&optional (n 1))
  (run n)
  (view))

実行してみる

(init)
;
;     DIMENSION 0 (X)  ----->
;
;0 0 0 0 0 0 0 0 
;0 0 0 1 1 0 0 0 
;0 0 1 1 0 0 0 0 
;0 0 0 1 0 0 0 0 
;0 0 0 0 0 0 0 0 

(view-step)
;     DIMENSION 0 (X)  ----->
;
;0 0 0 0 0 0 0 0 
;0 0 1 2 1 0 0 0 
;0 0 1 2 1 0 0 0 
;0 0 1 1 0 0 0 0 
;0 0 0 0 0 0 0 0 

(view-step 45)  ...
;
;     DIMENSION 0 (X)  ----->
;
;0 0 0 0 0 0 0 0 
;0 0 0 8 3 0 0 0 
;0 0 5 0 7 0 0 0 
;0 0 4 5 9 0 0 0 
;0 0 0 0 0 0 0 0 

しかし、これだと、おなじ升目から動かない。

→ノイマン型だから

;; moore型に変更
(setq *neighborhood* :moore)
(init) 
;
;     DIMENSION 0 (X)  ----->
;
;0 0 0 0 0 0 0 0 
;0 0 0 1 1 0 0 0 
;0 0 1 1 0 0 0 0 
;0 0 0 1 0 0 0 0 
;0 0 0 0 0 0 0 0 

(view-step) 
;
;     DIMENSION 0 (X)  ----->
;
;0 0 0 1 1 0 0 0 
;0 0 1 2 2 0 0 0 
;0 0 2 0 0 0 0 0 
;0 0 1 2 1 0 0 0 
;0 0 0 0 0 0 0 0 

(view-step 50)  
;
;     DIMENSION 0 (X)  ----->
;
;1 2 1 0 5 0 7 0 
;1 1 1 1 7 0 9 1 
;3 1 0 1 1 5 0 0 
;0 0 1 1 1 1 2 4 
;2 0 1 0 1 1 1 0 

ムーア型だと大分ばらける

ArcでL-99 (P06 リストの中身が回文的かを調べる)

| 07:07 | ArcでL-99 (P06 リストの中身が回文的かを調べる) - わだばLisperになる を含むブックマーク はてなブックマーク - ArcでL-99 (P06 リストの中身が回文的かを調べる) - わだばLisperになる

今回は、リストの内容が回文になっているかどうかを調べるというもの、ひっくりかえして比較すれば良いのですが、一応練習ということで丁寧に書いてみました。

同じ要素で構成されたリストかを比較するので、isoを使っています。

(def palindrome (lst)
  ((afn (l acc)
	(if (no l)
	    (iso lst acc)
	    (self (cdr l) (cons (car l) acc))))
   lst () ))

;; 簡単に
(def palindrome (lst)
  (iso (rev lst) lst))

(palindrome '(x a m a x))
;-> t

(palindrome '(た け や ぶ や け た))
;-> t

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20080210