P13 ランレングスエンコード
g:cadr:id:g000001:20080321の記事をみて、パターンマッチが無性に使いたくなったのでGaucheで実装してみる。
末尾再帰にしなければ、意外とすっきり書ける?
(use util.match) (define (encode-direct lis) (match lis [() '()] [(a) (list a)] [((num a) . b) (if (eqv? a (car b)) (encode-direct (cons (list (+ 1 num) a) (cdr b))) (cons (list num a) (encode-direct b)))] [(a . b) (if (eqv? a (car b)) (encode-direct (cons (list 2 a) (cdr b))) (cons a (encode-direct b)))])) (encode-direct '(a a a a b c c a d d e e e e)) ;; => ((4 a) b (2 c) a (2 d) (4 e)) (encode-direct '(a a a a b c c a d d e)) ;; => ((4 a) b (2 c) a (2 d) e) (encode-direct '()) ;; => ()