in reply to Re^3: Switch the odd/even elements of an array
in thread Switch the odd/even elements of an array
I tend to like the mathematical solutions instead.
The following would let you reverse any N elements at a time in an array.
my @foo = (1..15); my $n = 5; my @bar = @foo[map {$_ + $n - 1 - 2 * ($_ % $n)} (0..$#foo)]; print "@bar";
Outputs
5 4 3 2 1 10 9 8 7 6 15 14 13 12 11
Obviously not as spiffy as using xor to switch odds and evens, but still pretty concise.
Alternatively, if you want to do a rotation of the elements instead of a reversal, you can use the following translation:
my @foo = (1..15); my $n = 5; my $i = 2; my @bar = @foo[map {my $r = $_ % $n; $_ - $r + (($r + $i) % $n)} (0..$ +#foo)]; print "@bar";
Outputs
3 4 5 1 2 8 9 10 6 7 13 14 15 11 12
- Miller
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^5: Switch the odd/even elements of an array
by johngg (Canon) on Mar 06, 2011 at 17:37 UTC |