This one ends up somewhere in the middle:
sub tux_for {
my ($length, $ones) = @_;
[ map { substr unpack ("b*", $_), 0, $length }
grep { $ones == unpack "%32b*" => $_ }
map { pack "L<", $_ }
0 .. oct "0b".join""=> (1) x $ones, (0) x ($length - $ones)
];
}
This one is 1200 x faster than Discipulus, but still 1200 x slower than the rest:
use Algorithm::FastPermute;
sub tux_a_fp {
my ($length, $ones) = @_;
my @l = ((0) x ($length - $ones), (1) x $ones);
my %seen;
permute { $seen{join "" => @l}++ } @l;
[ keys %seen ];
}
Enjoy, Have FUN! H.Merijn