Sujet : Re: Exercises please
De : Nobody447095 (at) *nospam* here-nor-there.org (B. Pym)
Groupes : comp.lang.lispDate : 21. Jun 2025, 21:26:29
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <10374hj$191qo$1@dont-email.me>
User-Agent : XanaNews/1.18.1.6
Pascal J. Bourguignon wrote:
and my solutions (still incomplete):
http://www.informatimago.com/develop/lisp/l99/index.html
Where we find:
(---------------------------------------------------------------
P13 (**) Run-length encoding of a list (direct solution).
Example:
* (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))
"
;; Iterative solution, uses only O(r) space:
(defun encode-modified (list)
(let ((result '())
(count 0)
(last-item nil))
(labels ((collect-result ()
(push (if (= 1 count)
last-item
(list count last-item))
result))
(new-item (item)
(setf count 1
last-item item))
(same-item ()
(incf count))
(return-result ()
(when (plusp count)
(collect-result))
(nreverse result)))
(dolist (item list (return-result))
(cond
((zerop count) (new-item item))
((eql item last-item) (same-item))
(t (collect-result)
(new-item item)))))))
---------------------------------------------------------------)
Gauche Scheme
(define (encode List)
(if (null? List)
()
(let
((tmp (fold
(lambda(x accum)
(if (equal? x (caar accum))
(cons (cons x (car accum)) (cdr accum))
(cons (list x) accum)))
`((,(car List)))
(cdr List))))
(reverse
(map
(lambda(xs) (let1 len (length xs)
(if (= 1 len) (car xs) (list len (car xs)))))
tmp)))))
gosh> (encode '(a a a a b c c a a d e e e e))
((4 a) b (2 c) (2 a) d (4 e))