P09: 連続して出現したエレメントをまとめる。
pushが結構便利。
;;; ;; P09 (**) Pack consecutive duplicates of list elements into sub-lists. ;; If a list contains repeated elements they should be placed in separate ;; sub-lists. ;; ;; Example: ;; * (pack '(a a a a b c c a a d e e e e )) ;; ((a a a a) (b) (c c) (a a) (d) (e e e e)) (defun pack (lis) (if (null lis) lis (let ((acc `((,(first lis))))) (dolist (elem (rest lis)) (if (eql (first (first acc)) elem) (push elem (first acc)) (push (list elem) acc))) (reverse acc)))) (pack '(a a a a b c c a a d e e e e)) ;; => ((A A A A) (B) (C C) (A A) (D) (E E E E)) (pack '(nil nil nil nil nil t t t t t)) ;; => ((NIL NIL NIL NIL NIL) (T T T T T)) (pack '(nil t t t t t nil)) ;; => ((NIL) (T T T T T) (NIL)) (pack '()) ;; => NIL