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


import extensions;
 
extension op : IntNumber
{
    zigzagMatrix()
    {
        auto result := IntMatrix.allocate(self, self);
 
        int i := 0;
        int j := 0;
        int d := -1;
        int start := 0;
        int end := self*self - 1;
 
        while (start < end)
        {
            result.setAt(i, j, start); start += 1;
            result.setAt(self - i - 1, self - j - 1, end); end -= 1;
 
            i := i + d;
            j := j - d;
            if (i < 0)
            {
                i:=i+1; d := d.Negative
            }
            else if (j < 0)
            {
                j := j + 1; d := d.Negative
            }
        };
 
        if (start == end)
        {
            result.setAt(i, j, start)
        };
 
        ^ result
    }
}
 
public program()
{
    console.printLine(5.zigzagMatrix()).readChar()
}