30 lines
455 B
Plaintext
30 lines
455 B
Plaintext
|
|
|
|
###
|
|
### permute-flop
|
|
###
|
|
|
|
## Chapter 4 section 3.1
|
|
|
|
sub permute {
|
|
my @items = @_;
|
|
my $n = 0;
|
|
return Iterator {
|
|
$n++, return @items if $n==0;
|
|
my $i;
|
|
my $p = $n;
|
|
for ($i=1; $i<=@items && $p%$i==0; $i++) {
|
|
$p /= $i;
|
|
}
|
|
my $d = $p % $i;
|
|
my $j = @items - $i;
|
|
return if $j < 0;
|
|
|
|
@items[$j+1..$#items] = reverse @items[$j+1..$#items];
|
|
@items[$j,$j+$d] = @items[$j+$d,$j];
|
|
|
|
$n++;
|
|
return @items;
|
|
};
|
|
}
|