Deutsch   English   Français   Italiano  
<10374hj$191qo$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: "B. Pym" <Nobody447095@here-nor-there.org>
Newsgroups: comp.lang.lisp
Subject: Re: Exercises please
Date: Sat, 21 Jun 2025 20:26:29 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 64
Message-ID: <10374hj$191qo$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Injection-Date: Sat, 21 Jun 2025 22:26:29 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="b22693aa257d9a554fc4138883cff5f9";
	logging-data="1345368"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1/F0OCHvAAjvW86Gs7bQ4mL"
User-Agent: XanaNews/1.18.1.6
Cancel-Lock: sha1:D+dTBcmqmuFc0b6SiKwFxVpgfS8=

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