: (binpack) ( item bins -- ) [ [ values sum ] map ] keep zip sort-keys values first push ; : binpack ( assoc n -- bins ) [ sort-values dup length ] dip tuck / ceiling [ ] map tuck [ (binpack) ] curry each ; : binpack* ( items n -- bins ) [ dup zip ] dip binpack [ keys ] map ; : binpack! ( items quot n -- bins ) [ dupd map zip ] dip binpack [ keys ] map ;