Acme-Tools
view release on metacpan or search on metacpan
t/test_perm2.pl view on Meta::CPAN
sub perm0 {
my @a=@_;
my $n=@a;
my @c=map 0, 1..$n;
print join(" ",@a)."\n";
my $i=0;
while($i<$n){
if($c[$i]<$i){
if($i%2==0){ @a[0,$i]=@a[$i,0] }
else { @a[$c[$i],$i]=@a[$i,$c[$i]] }
$c[$i]++;
$i=0;
print join(" ",@a)."\n";
}
else{
$c[$i]=0;
$i++;
}
}
}
sub perm_slow { #same golfed
my(@a,@c,$i,$p)=@_;
my $o=sub{print join("",map"$_ ",@a)."\n"}; &$o;
$c[$i]>=$i and $c[$i++]="0e0" or $p=$c[$i]++*($i%2),@a[$p,$i]=@a[$i,$p],$i=0,&$o while $i<@a;
}
sub perm { #same golfed and faster
my(@a,@c,$i,$p)=@_;
print join(" ",@a)."\n";
$c[$i]>=$i and $c[$i++]="0e0" or $p=$c[$i]++*($i%2),@a[$p,$i]=@a[$i,$p],$i=0,print(join(" ",@a)."\n") while $i<@a;
}
my $n=shift||4;
my @a=1..$n;
perm(@a);
__END__
https://en.wikipedia.org/wiki/Heap%27s_algorithm
time perl perm2.pl 8|md5sum #a3fc159cae1cdda4e3c8db1021a2ec81
time perl perm2.pl 8|sort|md5sum #b34c300f7ec5e403f6f7aac1997e3f9d
time perl perm.pl 8|md5sum #samme
( run in 0.501 second using v1.01-cache-2.11-cpan-39bf76dae61 )