5.5 KiB
5.5 KiB
title | author | date | url | wordtwit_post_info | categories | |||
---|---|---|---|---|---|---|---|---|
Ninety-nine Lisp Problems – P10の解答 | kazu634 | 2010-11-24 | /2010/11/24/_1632/ |
|
|
P9の解答で作成した関数を元にして、リスト空リストへの変換を行う形で解答を作成してみました。つまり
- packでリストを作成する
- packで作られたリストの中のリストを変換する手続きencode-listを作成する
- packに対してencode-listをmapする
感じでやってみました。
ソース
;; P10 (*) Run-length encoding of a list. ;; Use the result of problem P09 to implement the so-called run-length encoding data compression method. Consecutive duplicates of elements are encoded as lists (N E) where N is the number of duplicates of the element E. ;; Example: ;; * (encode '(a a a a b c c a a d e e e e)) ;; ((4 A) (1 B) (2 C) (2 A) (1 D)(4 E)) (define (pack-seed front sublist result l) (cond [(null? l) (append result (list sublist))] [(eq? front (car l)) (pack-seed front (append sublist (list front)) result (cdr l))] [else (pack-seed (car l) (list (car l)) (if (null? result) (if (null? sublist) '() (append result (list sublist))) (append result (list sublist))) (cdr l))])) (define (pack l) (pack-seed #f '() '() l)) (define (encode-list l) (let ((num (length l))) (append (list num) (list (car l))))) (encode-list '(a a a a a)) (define (encode l) (map (lambda (l) (encode-list l)) (pack l))) (encode '(a a a a b c c a a d e e e e))