or download this
$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)