sub getPos{
($x,$y,$s)=@_;($d=$x+$y)*($d++)/2
+($d%2?$y:$x)-($d>$s)*($d-$s)**2
}
####
for(my $x = 0; $x < $size; $x++){
for(my $y = 0; $y < $size; $y++){
print getPos($x, $y, $size)." ";
}
print "\n";
}
####
0 1 5 6 14 15 27 28 44 45
2 4 7 13 16 26 29 43 46 63
3 8 12 17 25 30 42 47 62 64
9 11 18 24 31 41 48 61 65 78
10 19 23 32 40 49 60 66 77 79
20 22 33 39 50 59 67 76 80 89
21 34 38 51 58 68 75 81 88 90
35 37 52 57 69 74 82 87 91 96
36 53 56 70 73 83 86 92 95 97
54 55 71 72 84 85 93 94 98 99
####
sub getPos{
my ($x,$y,$size)=@_;
my $d = $x+$y;
my $m = $d-$size;
my $p = (($d%2)?$x:$y);
my $dist = ($d*($d+1))/2;
my $index = $dist + $p;
if($d >= $size){
$index -= ($m+1)**2;
}
}
####
$==pop;print map{$y=$_;map(($d=$y+$_)*$d++/2-($d>$=)*($d-$=)**2+($d&1?$_:$y).$",@m),$/}@m=0..$=-1