Deutsch   English   Français   Italiano  
<v9jsuo$qnm3$1@dont-email.me>

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

Path: ...!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.python,comp.lang.lisp
Subject: Re: How do i get multiple Min() values?
Date: Thu, 15 Aug 2024 03:33:46 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 57
Message-ID: <v9jsuo$qnm3$1@dont-email.me>
References: <v6qu7m$2vg8q$1@dont-email.me> <v6tthj$3jj0a$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Injection-Date: Thu, 15 Aug 2024 05:33:46 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="7e5ecf5f7253603983f636ec904f7241";
	logging-data="876227"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX19ZASZpdwBBSeo4iR7DAq8J"
User-Agent: XanaNews/1.18.1.6
Cancel-Lock: sha1:cHbua32W4R2mxon6wpunhHTmWHI=
Bytes: 2274

B. Pym wrote:

> HenHanna wrote:
> 
> > 
> > How do i get multiple Min() values?
> > 
> >           e.g.      for   Y = (x-2)*(x-3)   for x in range(-10,10)
> >                                    the min Y is hit twice
> > 
> > 
> > print(  min( ((x-2)*(x-3),  (x, (x-2, x-3)))
> >                                            for x in range(-10,10) ) )
> > 
> > 
> > 
> > is this easy in Scheme(Gauche) ?
> 
> Gauche Scheme
> 
> (use gauche.collection) ;; fold2
> 
> (define (min-by fn lst)
>   (if (null? lst)
>     (values '() #f)
>     (fold2
>       (lambda (x best worth)
>         (let ((score (fn x)))
>           (cond ((< score worth) (values (list x) score))
>                 ((= score worth) (values (cons x best) worth))
>                 (#t (values best worth)))))
>       (take lst 1) (fn (car lst))
>       (cdr lst))))
> 
> (min-by (lambda(x) (* (- x 2) (- x 3))) (lrange -10 11))
> 
>   ===>
> (3 2)
> 0

newLISP

(define (min-by fun lst)
  (let (accum '() best 0 score 0)
    (dolist (x lst)
      (setf score (fun x))
      (cond ((or (empty? accum) (< score best))
             (setf best score)
             (setf accum (list x)))
            ((= score best) (push x accum))))
    (list accum best)))

(min-by (fn(n) (- (abs (* 10 n)))) '(0 9 2 2 -9 3))
  ===>
((-9 9) -90)