procedure main(args) n := integer(!args) | 5 every !(A := list(n)) := list(n) A := zigzag(A) show(A) end procedure show(A) every writes(right(!A,5) | "\n") end procedure zigzag(A) x := [0,0] every i := 0 to (*A^2 -1) do { x := nextIndices(*A, x) A[x[1]][x[2]] := i } return A end procedure nextIndices(n, x) return if (x[1]+x[2])%2 = 0 then if x[2] = n then [x[1]+1, x[2]] else [max(1, x[1]-1), x[2]+1] else if x[1] = n then [x[1], x[2]+1] else [x[1]+1, max(1, x[2]-1)] end