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


with javascript_semantics
integer n = 9
integer zstart = 0, zend = n*n-1
--integer zstart = 1, zend = n*n
string fmt = sprintf("%%%dd",length(sprintf("%d",zend)))
sequence m = repeat(repeat("??",n),n)
integer x = 1, y = 1, d = -1
while 1 do
    m[x][y] = sprintf(fmt,zstart)
    if zstart=zend then exit end if
    zstart += 1
    m[n-x+1][n-y+1] = sprintf(fmt,zend)
    zend -= 1
    x += d
    y -= d
    if x<1 then
        x += 1
        d = -d
    elsif y<1 then
        y += 1
        d = -d
    end if
end while
 
for i=1 to n do
    m[i] = join(m[i])
end for
puts(1,join(m,"\n"))
