Sujet : Re: P09
De : HenHanna (at) *nospam* devnull.tb (HenHanna)
Groupes : comp.lang.lispDate : 10. Jun 2024, 01:23:03
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <v45dhf$3s5s5$1@dont-email.me>
References : 1
User-Agent : Mozilla Thunderbird
On 6/9/2024 6:32 AM, B. Pym wrote:
P09 (**) Pack consecutive duplicates of list elements into sublists.
If a list contains repeated elements they should be placed in
separate sublists.
Example:
* (pack '(a a a a b c c a a d e e e e))
((A A A A) (B) (C C) (A A) (D) (E E E E))
Pascal Bourguignon wrote:
;; Nice recursive solution:
>
(defun group (list)
(labels ((group-run (element group list)
(cond
((null list) (list (cons element group)))
((eql element (first list)) (group-run element (cons element group) (rest list)))
(t (cons (cons element group) (group-run (first list) '() (rest list)))))))
(if (null list)
'()
(group-run (first list) '() (rest list)))))
>
>
>
;; Smartass solution, using Common Lisp reduce:
>
(defun group (list)
(reduce (lambda (item result)
(cond
((endp result) (list (list item)))
((eql (first (first result)) item) (cons (cons item (first result))
(rest result)))
(t (cons (list item) result))))
list
:from-end t
:initial-value '()))
Gauche Scheme
(use srfi-1) ;; span
(define (group lst)
(if (null? lst)
'()
(let-values (((a b) (span (cut equal? (car lst) <>) lst)))
(cons a (group b)))))
(group '(2 2 foo bar bar j j j k baz baz))
===>
((2 2) (foo) (bar bar) (j j j) (k) (baz baz))
(use srfi-1) ;; span
(define (gp x)
(if (null? x) '()
(let-values (((F L) (span (cut equal? (car x) <>) x)))
(cons F (gp L)))))
(print (gp '(a b b a a a b b b b)))
(print (gp '(c c c a d d d d a e e e e e)))
(define (gpC x) (map (lambda (x) (list (car x) (length x))) (gp x)))
(print (gpC '(a b b a a a b b b b)))
(print (gpC '(c c c a d d d d a e e e e e)))
There's no way to write (lambda (x) (list (car x) (length x)))
using Cut or Cute???