1 ! Copyright (C) 2008 John Benediktsson
2 ! See https://factorcode.org/license.txt for BSD license
4 USING: accessors assocs kernel math sequences sorting ;
10 TUPLE: bin items total ;
13 V{ } clone 0 bin boa ; inline
15 : smallest-bin ( bins -- bin )
16 [ total>> ] infimum-by ; inline
18 : add-to-bin ( item weight bin -- )
19 [ + ] change-total items>> push ;
21 :: (binpack) ( alist #bins -- bins )
22 alist sort-values <reversed> :> items
23 #bins [ <bin> ] replicate :> bins
24 items [ bins smallest-bin add-to-bin ] assoc-each
25 bins [ items>> ] map ;
29 : binpack ( items #bins -- bins )
30 [ dup zip ] dip (binpack) ;
32 : map-binpack ( items quot: ( item -- weight ) #bins -- bins )
33 [ dupd map zip ] dip (binpack) ; inline