math.combinatorics: implementing "next-permutation".
							parent
							
								
									9ee314b906
								
							
						
					
					
						commit
						8d56193edd
					
				|  | @ -103,6 +103,12 @@ HELP: >permutation | ||||||
| { $notes "For clarification, the following two statements are equivalent:" { $code "10 factoradic >permutation" "{ 1 2 0 0 } >permutation" } } | { $notes "For clarification, the following two statements are equivalent:" { $code "10 factoradic >permutation" "{ 1 2 0 0 } >permutation" } } | ||||||
| { $examples { $example "USING: math.combinatorics.private prettyprint ;" "{ 0 0 0 0 } >permutation ." "{ 0 1 2 3 }" } } ; | { $examples { $example "USING: math.combinatorics.private prettyprint ;" "{ 0 0 0 0 } >permutation ." "{ 0 1 2 3 }" } } ; | ||||||
| 
 | 
 | ||||||
|  | HELP: next-permutation | ||||||
|  | { $values { "seq" sequence } { "seq" sequence } } | ||||||
|  | { $description "Rearranges the elements in " { $snippet "seq" } " into the lexicographically next greater permutation of elements" } | ||||||
|  | { $notes "Performs an in-place modification of " { $snippet "seq" } "." } | ||||||
|  | { $examples { $example "USING: math.combinatorics prettyprint ;" "\"ABC\" next-permutation ." "\"ACB\"" } } ; | ||||||
|  | 
 | ||||||
| HELP: all-subsets | HELP: all-subsets | ||||||
| { $values { "seq" sequence } { "subsets" sequence } } | { $values { "seq" sequence } { "subsets" sequence } } | ||||||
| { $description | { $description | ||||||
|  |  | ||||||
|  | @ -44,6 +44,12 @@ IN: math.combinatorics.tests | ||||||
| [ { 2 1 0 } ] [ { "c" "b" "a" } inverse-permutation ] unit-test | [ { 2 1 0 } ] [ { "c" "b" "a" } inverse-permutation ] unit-test | ||||||
| [ { 3 0 2 1 } ] [ { 12 45 34 2 } inverse-permutation ] unit-test | [ { 3 0 2 1 } ] [ { 12 45 34 2 } inverse-permutation ] unit-test | ||||||
| 
 | 
 | ||||||
|  | [ "" ] [ "" next-permutation ] unit-test | ||||||
|  | [ "1" ] [ "1" next-permutation ] unit-test | ||||||
|  | [ "21" ] [ "12" next-permutation ] unit-test | ||||||
|  | [ "8344112666" ] [ "8342666411" next-permutation ] unit-test | ||||||
|  | [ "ABC" "ACB" "BAC" "BCA" "CAB" "CBA" "ABC" ] | ||||||
|  | [ "ABC" 6 [ dup >string next-permutation ] times ] unit-test | ||||||
| 
 | 
 | ||||||
| [ 2598960 ] [ 52 iota 5 <combo> choose ] unit-test | [ 2598960 ] [ 52 iota 5 <combo> choose ] unit-test | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -61,6 +61,27 @@ PRIVATE> | ||||||
| : inverse-permutation ( seq -- permutation ) | : inverse-permutation ( seq -- permutation ) | ||||||
|     <enum> sort-values keys ; |     <enum> sort-values keys ; | ||||||
| 
 | 
 | ||||||
|  | <PRIVATE | ||||||
|  | 
 | ||||||
|  | : cut-point ( seq -- n ) | ||||||
|  |     [ last ] keep [ [ > ] keep swap ] find-last drop nip ; | ||||||
|  | 
 | ||||||
|  | : greater-from-last ( n seq -- i ) | ||||||
|  |     [ nip ] [ nth ] 2bi [ > ] curry find-last drop ; | ||||||
|  | 
 | ||||||
|  | : reverse-tail! ( n seq -- seq ) | ||||||
|  |     [ swap 1 + tail-slice reverse! drop ] keep ; | ||||||
|  | 
 | ||||||
|  | : (next-permutation) ( seq -- seq ) | ||||||
|  |     dup cut-point [ | ||||||
|  |         swap [ greater-from-last ] 2keep | ||||||
|  |         [ exchange ] [ reverse-tail! nip ] 3bi | ||||||
|  |     ] [ reverse! ] if* ; | ||||||
|  | 
 | ||||||
|  | PRIVATE> | ||||||
|  | 
 | ||||||
|  | : next-permutation ( seq -- seq ) | ||||||
|  |     dup [ ] [ drop (next-permutation) ] if-empty ; | ||||||
| 
 | 
 | ||||||
| ! Combinadic-based combination methodology | ! Combinadic-based combination methodology | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue