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


0 value diag
 
: south  diag abs + cell+ ;
 
' cell+ value zig
' south value zag
 
: init ( n -- )
  1- cells negate to diag
  ['] cell+ to zig
  ['] south to zag ;
 
: swap-diag   zig zag to zig to zag ;
 
: put ( n addr -- n+1 addr )
  2dup !  swap 1+ swap ;
 
: turn ( addr -- addr+E/S )
  zig execute  swap-diag
  diag negate to diag ;
 
: zigzag ( matrix n -- )
  { n } n init
  0 swap
  n 1 ?do
    put turn
    i 0 do put diag + loop
  loop
  swap-diag
  n 1 ?do
    put turn
    n i 1+ ?do put diag + loop
  loop
  ! ;
 
: .matrix ( n matrix -- )
  over 0 do
    cr
    over 0 do
      dup @ 3 .r cell+
    loop
  loop 2drop ;
 
: test ( n -- )  here over zigzag here .matrix ; 
5 test
  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 ok