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


# zig-zag matrix
 
makeZigZag := proc( n :: number ) :: table is
 
    local move := proc( x :: number, y :: number, upRight :: boolean ) is
        if   y = n then
            upRight := not upRight;
            x := x + 1
        elif x = 1 then
            upRight := not upRight;
            y := y + 1
        else
            x := x - 1;
            y := y + 1
        fi;
        return x, y, upRight
    end ;
 
    # create empty table
    local result := [];
    for i to n do
        result[ i ] := [];
        for j to n do result[ i, j ] := 0 od
    od;
 
    # fill the table
    local x, y, upRight := 1, 1, true;
    for i to n * n do
        result[ x, y ] := i - 1;
        if upRight then
            x, y, upRight := move( x, y, upRight )
        else
            y, x, upRight := move( y, x, upRight )
        fi
    od;
 
    return result
end;
 
scope
    local m := makeZigZag( 5 );
    for i to size m do
        for j to size m do
            printf( " %3d", m[ i, j ] )
        od;
        print()
    od
epocs