Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: "B. Pym" Newsgroups: comp.lang.python,comp.lang.lisp Subject: Re: How do i get multiple Min() values? Date: Sat, 13 Jul 2024 19:11:07 -0000 (UTC) Organization: A noiseless patient Spider Lines: 65 Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Injection-Date: Sat, 13 Jul 2024 21:11:07 +0200 (CEST) Injection-Info: dont-email.me; posting-host="bb9db39bc7686b389eb5c60179405e43"; logging-data="3912852"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/FLSb+EvF0oD+IbwinEijB" User-Agent: XanaNews/1.18.1.6 Cancel-Lock: sha1:5uXb9pigYNHeAVbw0w3VLteWLDM= Bytes: 2599 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 > (use gauche.collection) ;; fold2 (define (min-max-by fn lst) (define (use compare x score best worth) (cond ((compare score worth) (list (list x) score)) ((= score worth) (list (cons x best) worth)) (#t (list best worth)))) (if (null? lst) (values (list '() #f) (list '() #f)) (let ((initial (list (take lst 1) (fn (car lst))))) (fold2 (lambda (x mini maxi) (let ((score (fn x))) (values (apply use < x score mini) (apply use > x score maxi)))) initial initial (cdr lst))))) (min-max-by (lambda(x) (* (- x 2) (- x 3))) (lrange -10 11)) ===> ((3 2) 0) ((-10) 156)