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 "/fmt" for Conv, Fmt
 
var zigzag = Fn.new { |n|
    var r = List.filled(n*n, 0)
    var i = 0
    var n2 = n * 2
    for (d in 1..n2) {
        var x = d - n
        if (x < 0) x = 0
        var y = d - 1
        if (y > n - 1) y = n - 1
        var j = n2 - d
        if (j > d) j = d
        for (k in 0...j) {
            if (d&1 == 0) {
                r[(x+k)*n+y-k] = i
            } else {
                r[(y-k)*n+x+k] = i
            }
            i = i + 1
        }
    }
    return r
}
 
var n = 5
var w = Conv.itoa(n*n - 1).count
var i = 0
for (e in zigzag.call(n)) {
    Fmt.write("$*d ", w, e)
    if (i%n == n - 1) System.print()
    i = i + 1
}