Instantly share code, notes, and snippets.

# pjlsergeant/permutation.pl Created Jan 1, 2011

 sub permutation { my ( \$desired_permutation, \$column_count, \$permutation_set ) = @_; my \$permutation_set_count = @\$permutation_set; # The total number of permutations my \$total_permutations = \$permutation_set_count ** \$column_count; # Return if we're being asked for a permutation outside the total number # possible return if \$desired_permutation >= \$total_permutations; # Calculate the desired_permutation in base x where x = \$permutations_set_count my \$num = \$desired_permutation; my \$base = \$permutation_set_count; my \$s = []; while (1) { my \$r = \$num % \$base; unshift( @\$s, \$r ); \$num = int(\$num / \$base); last if \$num == 0; } while ( @\$s < \$column_count ) { unshift( @\$s, 0 ); } # @\$s is now a list corresponding to the permutation, where each number is # an index of the permutation set # Now we build the permutation by substituting those for the set return join '|', map { \$permutation_set->[\$_] } @\$s; } my \$i=0; while (1) { my \$p = permutation( \$i++, 3, [qw( 0 3 6 9 C F )] ); if ( defined \$p ) { print "\$p\n"; } else { last; } }