use strict;
use warnings;
my $n = shift;
my $count = 1;
my @matrix;
push @matrix, [(0)] for (1..$n);
buildRing (0, $n - 1);
my $width = length sprintf ("%s", '' . $count);
my $format = "%${width}d";
print "" . (join " ", map {sprintf $format, $_} @{$matrix[$_]}) . "\n" for (0..($n-1));
sub buildRing
{
my ($first, $last) = @_;
$matrix[$first][$_] = $count++ for ($first..$last);
$matrix[$_][$last] = $count++ for (($first+1)..$last);
$matrix[$last][$last-$_+$first-1] = $count++ for ($first..$last-1);
for ($_ = --$last; $_ > $first; --$_)
{$matrix[$_][$first] = $count++}
$matrix[$first][$last] = $count if (++$first == $last);
buildRing ($first, $last) if ($first<$last);
}
####
use strict;
use warnings;
my $n = shift || 5;
my ($count, $first, $last) = (1, 0, $n - 1);
my @matrix;
push @matrix, [(0)] for (1..$n);
{
$matrix[$first][$_] = $count++ for ($first..$last);
$matrix[$_][$last] = $count++ for (($first+1)..$last);
$matrix[$last][$last-$_+$first-1] = $count++ for ($first..$last-1);
for ($_ = --$last; $_ > $first; --$_)
{$matrix[$_][$first] = $count++}
$matrix[$first][$last] = $count if (++$first == $last);
redo unless $first >= $last;
}
my $width = (int log $count) - 1;
print "" . (join " ", map {sprintf "%${width}d", $_} @{$matrix[$_]}) . "\n" for (0..($n-1));
##
##
$n=shift;($c,$f,$l,@m)=(1,0,--$n);
{$m[$f][$_]=$c++for($f..$l);$m[$_][$l]=$c++for($f+1..$l);
$m[$l][$l-$_+$f-1]=$c++for($f..$l-1);for($_=--$l;$_>$f;--$_){$m[$_][$f]=$c++}
$m[$f][$l]=$c if(++$f==$l);redo unless$f>$l}my$w=(int log$c);
print"".(join"",map{sprintf"%${w}d",$_}@{$m[$_]})."\n"for(0..$n)