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: function [n][
    result: map 1..n 'x -> map 1..n => 0
 
    x: 1, y: 1, v: 0, d: 1
 
    while [v < n^2][
        if? all? @[1 =< x x =< n 1 =< y y =< n][
            set get result (y-1) (x-1) v
            x: x + d, y: y - d, v: v + 1
        ]
        else[if? x > n [x: n, y: y + 2, d: neg d]
            else[if? y > n [x: x + 2, y: n, d: neg d]
                else[if? x < 1 [x: 1, d: neg d]
                    else[if y < 1 [y: 1, d: neg d]
                    ]
                ]
            ]
        ]
    ]
    result
]
 
zz: zigzag 5
loop zz 'row -> print map row 'col [pad to :string col 3]