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


zigzag(n) := block([a, i, j],
a: zeromatrix(n, n),
i: 1,
j: 1,
for k from 0 thru n*n - 1 do (
   a[i, j]: k,
   if evenp(i + j) then (
      if j < n then j: j + 1 else i: i + 2,
      if i > 1 then i: i - 1      
   ) else (
      if i < n then i: i + 1 else j: j + 2,
      if j > 1 then j: j - 1
   )
),
a)$
 
zigzag(5);
/* matrix([ 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]) */