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


 
(define odd? A -> (= 1 (MOD A 2)))
(define even? A -> (= 0 (MOD A 2)))
 
(define zigzag-val
  0 0 N -> 0
 
  X 0 N -> (1+ (zigzag-val (1- X) 0 N)) where (odd? X)
  X 0 N -> (1+ (zigzag-val (1- X) 1 N)) 
 
  0 Y N -> (1+ (zigzag-val 1 (1- Y) N)) where (odd? Y)
  0 Y N -> (1+ (zigzag-val 0 (1- Y) N))
 
  X Y N -> (1+ (zigzag-val (MAX 0 (1- X)) (MIN (1- N) (1+ Y)) N)) where (even? (+ X Y))
  X Y N -> (1+ (zigzag-val (MIN (1- N) (1+ X)) (MAX 0 (1- Y)) N)))
 
(define range
  E E -> []
  S E -> [S|(range (1+ S) E)])
 
(define zigzag
  N -> (map (/. Y 
                (map (/. X 
                         (zigzag-val X Y N)) 
                     (range 0 N)))
            (range 0 N)))
 