P11-P15 取り合えずコードだけ+

  • P11
(define (encode ls)
 (let iter ( (l ls) (len 0) (last '()) (ret '()))
   (cond
     ( (null? l)
      (cond 
        ( (= len 0)
         ret)
        ( (= len 1)
         (append ret (list len)))
        (else
         (append ret (list (list len last))))))
     ( (null? last)
      (iter (cdr l) 1 (car l) ret))
     ( (eq? (car l) last)
      (iter (cdr l) (+ len 1) (car l) ret))
     (else
       (if (> len 1)
         (iter (cdr l) 1 (car l) (append ret (list (list len last))))
         (iter (cdr l) 1 (car l) (append ret (list last))))))))

(print (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))
  • P12
(define (decode ls)
  (define (s-times l)
    (let iter ( (i (car l)) (s (cadr l)) (ret '()))
      (if (= i 0)
        ret
        (iter (- i 1) s (append ret (list s))))))
  (let iter ( (l ls) (ret '()))
    (cond
      ( (null? l)
       ret)
      ( (pair? (car l))
       (iter (cdr l) (append ret (s-times (car l)))))
      (else
        (iter (cdr l) (append ret (list (car l))))))))

(print (decode '((4 a) b (2 c) (2 a) d (4 e))))
  • P14
(define (dupli ls)
  (let iter ( (l ls) (i 2) (acc '()) (ret '()))
    (cond
      ( (null? l)
       ret)
      ( (= i 0)
       (iter (cdr l) 2 '() (append ret acc)))
      (else
        (iter l (- i 1) (append acc (list (car l))) ret)))))

(print (dupli '(a b c c d)))
  • P15
(define (repli ls count)
  (let iter ( (l ls) (i count) (acc '()) (ret '()))
    (cond
      ( (null? l)
       ret)
      ( (= i 0)
       (iter (cdr l) count '() (append ret acc)))
      (else
        (iter l (- i 1) (append acc (list (car l))) ret)))))

(print (repli '(a b c) 3))