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-03-21

CLOSでL-99 (P13 ランレングス圧縮 その3)

| 19:59 | CLOSでL-99 (P13 ランレングス圧縮 その3) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSでL-99 (P13 ランレングス圧縮 その3) - わだばLisperになる

Qiと同じくencode-modifiedの解釈がP13の解釈になっていたので、修正しつつ解答。

パターンマッチングが使える場合、P13よりは、P11の方が面白いかもしれないと思いつつ、パターンマッチの道具としてCLOSを使うというのはやはり濫用だなな思いつつ(笑)

(encode-direct '(a a a a b c c a a d e e e e))
;=> ((4 A) B (2 C) (2 A) D (4 E))

(defgeneric encode-direct (lst)
  (:method ((lst null)) () )
  (:method ((lst cons))
    (let ((pack (pack lst)))
      (encode-direct1 (caar pack) (cdar pack) pack))))

(defgeneric encode-direct1 (head-item head-cdr lst)
  (:method (head-item head-cdr (lst null)) () )
  (:method (head-item (head-cdr null) (lst cons))
    (cons head-item (encode-direct1 (caadr lst) (cdadr lst) (cdr lst))))
  (:method (head-item head-cdr (lst cons))
    (cons `(,(length (cons head-item head-cdr)) ,head-item)
	  (encode-direct1 (caadr lst) (cdadr lst) (cdr lst)))))


(encode-modified '(a a a a b c c a a d e e e e))
;=> ((4 A) B (2 C) (2 A) D (4 E))

(defmethod encode-modified ((lst null))
  () )

(defmethod encode-modified (lst)
  (let ((lst (encode lst)))
    (encode-modified1 (caar lst) (cadar lst) lst)))

(defmethod encode-modified1 (head-num head-item (lst null)) 
  () )

(defmethod encode-modified1 ((head-num (eql 1)) head-item (lst cons))
  (cons head-item
        (let ((next-head (cadr lst)))
          (encode-modified1 (car next-head) (cadr next-head) (cdr lst)))))

(defmethod encode-modified1 (head-num head-item (lst cons))
  (cons (car lst)
	(let ((next-head (cadr lst)))
	  (encode-modified1 (car next-head) (cadr next-head) (cdr lst)))))