interesting approach that reminded me about some old project that needed some permutations generations stuff... so, i've checked up that code and here i come with a reviewed standalone version:
#!/usr/bin/perl -w
# DESCRIPTION: Generate permutations in lexicographic order
# USAGE: ./permlex.pl <term1> <term2> <term3> .....
use strict;
die "bleah... nothing to permutate\n" if $#ARGV<0;
my @terms = @ARGV; my $n = $#ARGV; my @a = (0..$n);
genperm(); exit(0);
sub genperm {
print join(" ",@terms[@a]),"\n";
my ($k,$j) = ($n-1,$n);
$k-- while ($k>=0 and $a[$k]>$a[$k+1]);
return(0) if ($k<0);
$j-- while ($a[$k]>$a[$j]);
swap($j,$k++); $j=$n;
swap($j--,$k++) while ($j>$k);
genperm();
}
sub swap {
my ($i,$j) = @_; my $t = $a[$i];
($a[$i],$a[$j]) = ($a[$j],$t);
}
as you may see, it's a pure lexicographic permutations generator algorithm, as in the books ;-)
oh, not to forget, just checked up on cpan and found out there is a Algorithm::Permute module. here is a lame example for module users ;-)
#!/usr/bin/perl -w
use strict;
die "bleah... nothing to permutate\n" unless defined @ARGV;
use Algorithm::Permute qw(permute permute_ref);
print join(" ", @$_), "\n" for permute(\@ARGV);
-- AltBlue. |