37 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			37 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Factor
		
	
	
! Copyright (C) 2013 John Benediktsson
 | 
						|
! See http://factorcode.org/license.txt for BSD license
 | 
						|
USING: fry kernel math math.bitwise sequences ;
 | 
						|
IN: math.combinatorics.bits
 | 
						|
 | 
						|
: next-permutation-bits ( v -- w )
 | 
						|
    [ dup 1 - bitor 1 + dup ] keep
 | 
						|
    [ dup neg bitand ] bi@ /i 2/ 1 - bitor ;
 | 
						|
 | 
						|
<PRIVATE
 | 
						|
 | 
						|
: permutation-bits-quot ( bit-count bits quot -- n pred body )
 | 
						|
    [ [ on-bits dup '[ dup _ >= ] ] [ on-bits ] bi* ] dip swap
 | 
						|
    '[ _ [ next-permutation-bits _ bitand ] bi ] ; inline
 | 
						|
 | 
						|
PRIVATE>
 | 
						|
 | 
						|
: each-permutation-bits ( ... bit-count bits quot: ( ... n -- ... ) -- ... )
 | 
						|
    permutation-bits-quot while drop ; inline
 | 
						|
 | 
						|
: map-permutation-bits ( ... bit-count bits quot: ( ... n -- ... m ) -- ... seq )
 | 
						|
    permutation-bits-quot [ swap ] compose produce nip ; inline
 | 
						|
 | 
						|
: filter-permutation-bits ( ... bit-count bits quot: ( ... n -- ... ? ) -- ... seq )
 | 
						|
    selector [ each-permutation-bits ] dip ; inline
 | 
						|
 | 
						|
: all-permutation-bits ( bit-count bits -- seq )
 | 
						|
    [ ] map-permutation-bits ;
 | 
						|
 | 
						|
: find-permutation-bits ( ... bit-count bits quot: ( ... n -- ... ? ) -- ... elt/f )
 | 
						|
    [ f f ] 3dip [ 2nip ] prepose [ keep swap ] curry
 | 
						|
    permutation-bits-quot [ [ pick not and ] compose ] dip
 | 
						|
    while drop swap and ; inline
 | 
						|
 | 
						|
: reduce-permutation-bits ( ... bit-count bits identity quot: ( ... prev elt -- ... next ) -- ... result )
 | 
						|
    [ -rot ] dip each-permutation-bits ; inline
 |