P13 ランレングスエンコード
副作用ばりばりで。
;; P13 (defun encode-direct (lis) (if (null lis) lis (do ((acc '()) (target (car lis)) (count 1) (l (cdr lis) (cdr l))) ((null l) (reverse (cons target acc))) (if (and (eql target (car l))) (incf count) (progn (push (if (= count 1) target (list count target)) acc) (setf target (car l) count 1)))))) (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)) (encode-direct '(a)) ;; => (A) (encode-direct '(nil)) ;; => (NIL) (encode-direct '()) ;; => NIL (encode-direct '(nil nil nil)) ;; => ((3 NIL))