Re: walk through list and add all n'th item

Liste des GroupesRevenir à cl lisp 
Sujet : Re: walk through list and add all n'th item
De : 643-408-1753 (at) *nospam* kylheku.com (Kaz Kylheku)
Groupes : comp.lang.lisp
Date : 30. Aug 2024, 19:02:59
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <20240830100202.195@kylheku.com>
References : 1
User-Agent : slrn/pre1.0.4-9 (Linux)
On 2024-08-30, B. Pym <Nobody447095@here-nor-there.org> wrote:
I'm just wondering if there is a lispier way to scan once through a
list and add each n'th item with n+constant.
Like kind of apply a list through a vector..
In my approach i  just used the loop macro:
(defparameter vals '(1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1
2 3 4 5 6 7 8))
...
CL-USER> (sum-values vals)
(4 8 12 16 20 24 28 32)
>
Can you do better? (i hope you do and I am prepared to bear the shame)
 
I see that you ask to "scan once" but still feel awfully
tempted to reblock the data
 
CL-USER> (defun batch (list size)
           (if (endp list)
               '()
               (cons (subseq list 0 size)
                     (batch (nthcdr size list) size))))
BATCH
 
CL-USER> (batch vals 8)
 
((1 2 3 4 5 6 7 8) (1 2 3 4 5 6 7 8) (1 2 3 4 5 6 7 8) (1 2 3 4 5 6 7 8))
 
CL-USER> (defun add (list)
           (reduce (lambda(u v)(mapcar #'+ u v)) list))
ADD
 
CL-USER> (add (batch vals 8))
(4 8 12 16 20 24 28 32)
>
Mark Wooding wrote:
>
Or you could just do it the easy way:
 
(defun sum-every-softcore (period list)
  (loop with sums = (make-array period :initial-element 0)
        for item in list
        for i = 0 then (mod (1+ i) period)
        do (incf (aref sums i) item)
        finally (return (coerce sums 'list))))
>
Gauche Scheme
>
(use srfi-42)  ;; do-ec
>
(define (sum-every-nth n nlist)
  (rlet1 result (make-vector n 0)
    (do-ec (:list x (index i) nlist)
      (inc! (vector-ref result (mod i n)) x))))
>
(define vals '(1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1
   2 3 4 5 6 7 8))
>
(sum-every-nth 8 vals)
>
#(4 8 12 16 20 24 28 32)

This is the TXR Lisp interactive listener of TXR 296.
Quit with :quit or Ctrl-D on an empty line. Ctrl-X ? for cheatsheet.
TXR Lisp environments use genuine Saskatchewan sealskin bindings.
1> (flow '(1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8)
     (tuples 8)
     transpose
     (mapcar sum))
(4 8 12 16 20 24 28 32)

--
TXR Programming Language: http://nongnu.org/txr
Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
Mastodon: @Kazinator@mstdn.ca

Date Sujet#  Auteur
30 Aug 24 * Re: walk through list and add all n'th item2B. Pym
30 Aug 24 `- Re: walk through list and add all n'th item1Kaz Kylheku

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal