#!/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
# 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 ] ; }
}
}
$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;
IyEvdXNyL2Jpbi9wZXJsCgpzdWIgZnsoJHIsJG0pPUBfOyRoPUBtPUAkbTtmb3IkcygwLi4oKCR3PSQjeyRtWzBdfSk8LS0kaD8kdzokaCkvMi0uNSl7QF89KEB7JG1bJHNdfVtAeD0kcy4uKCR4PSR3LSRzKV0sKG1hcCRtWyRfXVskeF0sQHk9MSskcy4uKCR5PSRoLSRzKS0xKSxyZXZlcnNlKEB7JG1bJHldfVtAeF0pLChtYXAkbVskaC0kX11bJHNdLEB5KSk7cHVzaEBfLHNoaWZ0CmZvciAxLi4kcjtAeyRtWyRzXX1bQHhdPW1hcCBzaGlmdCxAeDskbVskX11bJHhdPXNoaWZ0IGZvckB5O0B7JG1bJHldfVtAeF09cmV2ZXJzZSBtYXAgc2hpZnQsQHg7JG1bJGgtJF9dWyRzXT1zaGlmdCBmb3JAeX1AJG09QG19CgojIFRlc3RpbmcuCgp1c2UgVGVzdDo6TW9yZTsKCnN1YiBjbXBfbWF0cml4IHsKICAgIHJldHVybiB1bmxlc3MgQHskX1swXX0gPT0gQHskX1sxXX07CiAgICBmb3IgbXkgJGkgKDAgLi4gQHskX1swXX0gLSAxKSB7CiAgICAgICAgcmV0dXJuIHVubGVzcyBAeyRfWzBdWyRpXX0gPT0gQHskX1sxXVskaV19OwogICAgICAgIGZvciBteSAkaiAoMCAuLiBAeyRfWzBdWyRpXX0gLSAxKSB7CiAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJF9bMF1bJGldWyRqXSA9PSAkX1sxXVskaV1bJGpdOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgokdCA9IFtbMSwgIDIsICAzLCAgNCBdLAogICAgICBbNSwgIDYsICA3LCAgOCBdLAogICAgICBbOSwgIDEwLCAxMSwgMTJdLAogICAgICBbMTMsIDE0LCAxNSwgMTZdXTsKZigyLCAkdCk7Cm9rIGNtcF9tYXRyaXggJHQsCiAgICAgW1szLCAgNCwgIDgsIDEyXSwKICAgICAgWzIsIDExLCAxMCwgMTZdLAogICAgICBbMSwgIDcsICA2LCAxNV0sCiAgICAgIFs1LCAgOSwgMTMsIDE0XV07CiR0ID0gW1sxLCAyXSwKICAgICAgWzMsIDRdLAogICAgICBbNSwgNl1dOwpmKDIsICR0KTsKb2sgY21wX21hdHJpeCAkdCwKICAgICBbWzQsIDZdLAogICAgICBbMiwgNV0sCiAgICAgIFsxLCAzXV07CiR0ID0gW1sxLCAxXSwKICAgICAgWzIsIDJdLAogICAgICBbMywgM11dOwpmKDEsICR0KTsKb2sgY21wX21hdHJpeCAkdCwKICAgICBbWzEsIDJdLAogICAgICBbMSwgM10sCiAgICAgIFsyLCAzXV07CmRvbmVfdGVzdGluZzsK