Post by MadhuYou just need the count of the min value. you don't really need
"multiple min() values". right?
Post by Kaz KylhekuPost by HenHannaPost by HenHannae.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) ?
if the Min() is going to check all of the Candidate values,
it could (at least) tell us how many times the Min value was seen!
I decided to add something like this to TXR Lisp.
It will appear in 296.
This is the TXR Lisp interactive listener of TXR 295.
Quit with :quit or Ctrl-D on an empty line. Ctrl-X ? for cheatsheet.
When transferring between containers, do not siphon TXR by mouth.
1> (find-mins -10..11 : [callf * pppred ppred])
(2 3)
2> (find-mins (vec-seq -10..11) : [callf * pppred ppred])
#(2 3)
3> (find-mins "abracadabra")
"aaaaa"
4> (find-maxes "abracacabra")
"rr"
I works with any less-like function, assuming equality
when it's neither true that x is less than y, nor that
y is less than x.
Ugh. One would think it is
trivial in CL to track the min-count as a
wrapper around (reduce #'min list)
but the REDUCE spec makes it hairy to get edge cases right (where the
input is an empty list or singleton list).
(defun hen-min (list &aux (min-count 1))
"LIST is a list of numbers. Return the MIN of the list. Second
return value is the count of the MIN in the given LIST"
(values (reduce (lambda (&optional a b)
(when a
(prog1 (min a b)
(cond ((< b a) (setq min-count 1))
((= b a) (incf min-count))))))
list)
(if (endp list) 0 min-count)))
It still reads nicer without any [???]
Hen may have fallen into the "list comprehension sytnax" in constructing
the example he posted. But this is just a tar pit, which lets you lose
focus of the problem at hand (by inventing new problems)
in common lisp HEN-MAX has been extended MAX to return a second return
value with counts. This is the simplest abstraction to construct
solutions which require counts of MIN, and is sufficient for common
lisp, without the need to invent a new language feature or inventing new
syntax.
while CL has several generator libraries (which I haven't really used
seriously yet), in plain CL Hen's motivating example above would look
like this:
(loop for x from -10 to 10
collect (* (- x 2) (- x 3)) into A
collect x into B
collect (- x 2) into C
collect (- x 3) into D
finally (return (destructuring-bind (a b c d)
(mapcar (lambda (x)
(multiple-value-list (hen-min x)))
(list a b c d))
(values
(destructuring-bind (a b c d)
(mapcar 'car (list a b c d))
`(,a (,b (,c ,d))))
(destructuring-bind (a b c d)
(mapcar 'cadr (list a b c d))
`(,a (,b (,c ,d))))))))
;; => (0 (-10 (-12 -13))),
;; (2 (1 (1 1)))
The first value returns the minimum in the "compehended invented "tuple
structure, the second value returns the counts in the same structure.