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


from algorithm import sort
from strutils import align
from sequtils import newSeqWith
 
type Pos = tuple[x, y: int]
 
proc `<` (a, b: Pos): bool = 
  a.x + a.y < b.x + b.y or
    a.x + a.y == b.x + b.y and (a.x < b.x xor (a.x + a.y) mod 2 == 0)
 
proc zigzagMatrix(n: int): auto =
  var indices = newSeqOfCap[Pos](n*n)
 
  for x in 0 ..< n:
    for y in 0 ..< n:
      indices.add((x,y))
 
  sort(indices)
 
  result = newSeqWith(n, newSeq[int](n))
  for i, p in indices:
    result[p.x][p.y] = i
 
proc `$`(m: seq[seq[int]]): string =
  let Width = len($m[0][^1]) + 1
  for r in m:
    for c in r:
      result.add align($c, Width)
    result.add "\n"
 
echo zigzagMatrix(6)