Path: ...!weretis.net!feeder8.news.weretis.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: "B. Pym" Newsgroups: comp.lang.lisp Subject: Re: tasters wanted Date: Sat, 17 Aug 2024 18:24:51 -0000 (UTC) Organization: A noiseless patient Spider Lines: 79 Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Injection-Date: Sat, 17 Aug 2024 20:24:51 +0200 (CEST) Injection-Info: dont-email.me; posting-host="e7865b2a2b4911949ad7b06e6acc9726"; logging-data="2115126"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+KMi+m9Fy2KdyRDLjC7Wx1" User-Agent: XanaNews/1.18.1.6 Cancel-Lock: sha1:ypQC9/BXvvnSI6CvBTqQjOYXbUU= Bytes: 3128 B. Pym wrote: > B. Pym wrote: > > > B. Pym wrote: > > > > > B. Pym wrote: > > > > > > > Ken Tilton wrote: > > > > > > > > > Ooh! Ooh! Lemme try again! > > > > > > > > > > (defun collect-repeats-simple (sorted-list &key (test 'eql)) > > > > > (loop with acc and tail > > > > > for a in sorted-list > > > > > for b in (cdr sorted-list) > > > > > > > > > > if (funcall test a b) > > > > > if acc do (setf tail (rplacd tail (list b))) > > > > > else do (setf acc (list* a (setf tail (list b)))) > > > > > else when acc collect acc into result > > > > > and do (setf acc nil) > > > > > > > > > > finally (return (nconc result > > > > > (when acc (list acc)))))) > > > > > > > > > > God I love rplaca/d! > > > > > > > > > His definition is buggy. > > > > > > (collect-repeats-simple '(4 5 5 5 5 5 5 5 8 8)) > > > ===> > > > ((5 5 5) (8 8)) > > > > newLISP > > > > (define (collect-repeats sorted) > > (let (accum '() tmp '() a 0) > > (until (empty? (rest sorted)) > > (setq a (pop sorted)) > > (when (= a (sorted 0)) > > (setq tmp (list a)) > > (while (and sorted (= a (first sorted))) > > (push (pop sorted) tmp)) > > (push tmp accum))) > > (reverse accum))) > > > > > (collect-repeats '(2 4 4 0 5 5 5 5 8 8 8 6)) > > ((4 4) (5 5 5 5) (8 8 8)) > > > (collect-repeats '( 4 4 0 5 5 5 5 8 8 8 )) > > ((4 4) (5 5 5 5) (8 8 8)) > > > > Shorter: > > (define (collect-repeats sorted) > (let (accum '() tmp '() a) > (until (empty? sorted) > (setq a (sorted 0)) > (setq tmp > (collect > (and (true? sorted) (= a (sorted 0)) (pop sorted)))) > (when (> (length tmp) 1) (push tmp accum))) > (reverse accum))) Shorter: (define (collect-repeats sorted) (local (accum tmp a) (while sorted (setq a (sorted 0)) (setq tmp (collect (and (true? sorted) (= a (sorted 0)) (pop sorted)))) (and (1 tmp) (push tmp accum))) (reverse accum)))