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
 |