Task

Produce a zig-zag array.



A   zig-zag   array is a square arrangement of the first   N2   natural numbers,   where the

numbers increase sequentially as you zig-zag along the array's   anti-diagonals.

For a graphical representation, see   JPG zigzag   (JPG uses such arrays to encode images).



For example, given   5,   produce this array:

 0  1  5  6 14
 2  4  7 13 15
 3  8 12 16 21
 9 11 17 20 22
10 18 19 23 24



Related tasks

   Spiral matrix
   Identity matrix
   Ulam spiral (for primes)


See also

   Wiktionary entry:   anti-diagonals


fun rowprint r = (List.app (fn i => print (StringCvt.padLeft #" " 3 (Int.toString i))) r;
                  print "\n");
fun zig lst M  =  List.app rowprint (lst M);
 
fun sign t = if t mod 2 = 0 then ~1 else 1;
 
fun zag n = List.tabulate (n,
            fn i=> rev ( List.tabulate (n,
                        fn j =>
			     let val t = n-j+i  and  u =  n+j-i  in
			         if i <= j
                                    then   t*t div 2 + sign t * ( t div 2 - i )
                                    else   n*n - 1 - ( u*u div 2 + sign u * ( u div 2 - n + 1 + i) )
	                      end
			 )));
 
zig zag 5 ;