Rebol3 Code Examplex


Zig-zag matrix

Fill or read a matrix in zig-zag order.

Rebol [
    title: "Rosetta code: Zig-zag matrix"
    file:  %Zig-zag_matrix.r3
    url:   https://rosettacode.org/wiki/Zig-zag_matrix
]

zig-zag-matrix: function [size [integer!]][
    matrix: array/initial len: size * size 0  ;; Flat array, row-major
    x: 0 dx: -1
    y: 0 dy:  1
    repeat i len [ 
        case [
            x >= size [-- x y: y + 2 dx: negate dx dy: negate dy]
            y >= size [-- y x: x + 2 dx: negate dx dy: negate dy]
            all [y >= 0 x < 0][++ x  dx: negate dx dy: negate dy]
            all [x >= 0 y < 0][++ y  dx: negate dx dy: negate dy]
        ]
        matrix/(y * size + x + 1): i - 1
        x: x + dx
        y: y + dy
    ]
    new-line/skip matrix true size
    matrix
]

;; Example usage:
probe zig-zag-matrix 5