Here's my perl solution, which is more or less the
translation of the J solution:
#!perl
use warnings;
use strict;
use List::Util "max";
use Math::Complex; # what for?
my $n = int($ARGV[-1] || 5);
my($i, $j, $k, $x, $y, @l, @a, @v, @r, $wd, $fmt);
for $i (0 .. $n - 1) {
$x = $i - ($n - 1)/2;
for $j (0 .. $n - 1) {
$y = $j - ($n - 1)/2;
$k = $i * $n + $j;
$l[$k] = -max(abs($x), abs($y));
$a[$k] = -arg(cplx(1, -1) * cplx($x, $y));
}
}
@v = sort { $l[$a] <=> $l[$b] || $a[$a] <=> $a[$b] } 0 .. $n**2 - 1;
@r[@v] = 1 .. $n**2;
$wd = length($n**2);
$fmt = join(" ", ("%${wd}d") x $n) . "\n";
for $i (0 .. $n - 1) {
printf $fmt, @r[$i * $n .. $i * $n + $n - 1];
}
__END__