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


$ include "seed7_05.s7i";
 
const type: matrix is array array integer;
 
const func matrix: zigzag (in integer: size) is func
  result
    var matrix: s is matrix.value;
  local
    var integer: i is 1;
    var integer: j is 1;
    var integer: d is -1;
    var integer: max is 0;
    var integer: n is 0;
  begin
    s := size times size times 0;
    max := size ** 2;
    for n range 1 to max div 2 + 1 do
      s[i][j] := n;
      s[size - i + 1][size - j + 1] := max - n + 1;
      i +:= d;
      j -:= d;
      if i < 1 then
        incr(i);
        d := -d;
      elsif j < 1 then
        incr(j);
        d := -d;
      end if;
    end for;
  end func;
 
const proc: main is func
  local
    var matrix: s is matrix.value;
    var integer: i is 0;
    var integer: num is 0;
  begin
    s := zigzag(7);
    for i range 1 to length(s) do
      for num range s[i] do
        write(num lpad 4);
      end for;
      writeln;
    end for;
  end func;