Deutsch English Français Italiano |
<v92si3$40j1$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!feeds.phibee-telecom.net!weretis.net!feeder8.news.weretis.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: "B. Pym" <Nobody447095@here-nor-there.org> Newsgroups: comp.lang.lisp Subject: Re: drop it Date: Thu, 8 Aug 2024 16:42:46 -0000 (UTC) Organization: A noiseless patient Spider Lines: 67 Message-ID: <v92si3$40j1$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Injection-Date: Thu, 08 Aug 2024 18:42:47 +0200 (CEST) Injection-Info: dont-email.me; posting-host="623536926260db1f505ba92f19951445"; logging-data="131681"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18NThrIjGMSAUy84m+lBsln" User-Agent: XanaNews/1.18.1.6 Cancel-Lock: sha1:nDf9w5sVNqx7xldo+pO+qISAp8I= Bytes: 2811 Chris Russell wrote: > > > > Drop every N'th element from a list. > > > > Example: > > > > * (drop '(a b c d e f g h i k) 3) > > > > (A B D E G H K) > > > > > I'm guilty responding to a spammer, who doesn't help Lisp or OCaml by > > > posting wrong statements about it, so I'll solve your problem: > > > > > (defun drop (list n) > > > (loop for item in list > > > for i = 1 then (1+ i) > > > when (/= (mod i n) 0) collect item)) > > > > > Of course, in Haskell I can write it like this: > > > > > myDrop list n=[list!!x|x<-[0..length list-1], mod (1+x) n/=0] > > > > > and I'm sure this is not the shortest solution. But for me it is more > > > difficult to develop pure functional algorithms than using Lisp. > > > > It is not that difficult. > > > > (defun drop (list n) > > (labels ((drop-aux (list i) > > (cond ((null list) nil) > > ((= i 1) (drop-aux (rest list) n)) > > (t (cons (first list) > > (drop-aux (rest list) (1- i))))))) > > (drop-aux list n))) > > > > There are many extra points to get for a version using 'Series'. > > A few extra points for a tail-recursive version. > > > > Or you can take this one: > > > > (defun every-nth (n) > > (let ((i n)) > > (lambda () > > (prog1 (= i 1) > > (decf i) > > (when (zerop i) > > (setf i n)))))) > > > > Above returns a function that returns T for every n-th call. > > > > (defun drop (list n) > > (remove-if (every-nth n) list)) > > > > --http://lispm.dyndns.org > > Obligatory 1 line solution using map__: > > (defun remove-nth(n list) > (mapcan (let ((tick 0))(lambda(x) (when (/= 0 (rem (incf tick) n)) > (list x)))list)) newLISP (define (remove-nth n lst , i) (clean (fn() (= 0 (mod (++ i) n))) lst)) (remove-nth 3 '(a b c d e f g h i j k)) (a b d e g h j k)