#!/usr/bin/perl

sub f{($r,$m)=@_;$h=@m=@$m;for$s(0..(($w=$#{$m[0]})<--$h?$w:$h)/2-.5){@_=(@{$m[$s]}[@x=$s..($x=$w-$s)],(map$m[$_][$x],@y=1+$s..($y=$h-$s)-1),reverse(@{$m[$y]}[@x]),(map$m[$h-$_][$s],@y));push@_,shift
for 1..$r;@{$m[$s]}[@x]=map shift,@x;$m[$_][$x]=shift for@y;@{$m[$y]}[@x]=reverse map shift,@x;$m[$h-$_][$s]=shift for@y}@$m=@m}

# Testing.

use Test::More;

sub cmp_matrix {
    return unless @{$_[0]} == @{$_[1]};
    for my $i (0 .. @{$_[0]} - 1) {
        return unless @{$_[0][$i]} == @{$_[1][$i]};
        for my $j (0 .. @{$_[0][$i]} - 1) {
            return unless $_[0][$i][$j] == $_[1][$i][$j];
        }
    }
    return 1;
}

$t = [[1,  2,  3,  4 ],
      [5,  6,  7,  8 ],
      [9,  10, 11, 12],
      [13, 14, 15, 16]];
f(2, $t);
ok cmp_matrix $t,
     [[3,  4,  8, 12],
      [2, 11, 10, 16],
      [1,  7,  6, 15],
      [5,  9, 13, 14]];
$t = [[1, 2],
      [3, 4],
      [5, 6]];
f(2, $t);
ok cmp_matrix $t,
     [[4, 6],
      [2, 5],
      [1, 3]];
$t = [[1, 1],
      [2, 2],
      [3, 3]];
f(1, $t);
ok cmp_matrix $t,
     [[1, 2],
      [1, 3],
      [2, 3]];
done_testing;
