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.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.