(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))
(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))))
(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)))
(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))