#!/usr/bin/ruby

#
## https://rosettacode.org/wiki/Spiral_matrix
#

func spiral(n) {
    var (x, y, dx, dy, a) = (0, 0, 1, 0, []);
    { |i|
        a[y][x] = i+1;
        var (nx, ny) = (x+dx, y+dy);
        (dx, dy) =
            (  if (dx ==  1 && (nx == n || a[ny][nx]!=nil)) { ( 0,  1) }
            elsif (dy ==  1 && (ny == n || a[ny][nx]!=nil)) { (-1,  0) }
            elsif (dx == -1 && (nx  < 0 || a[ny][nx]!=nil)) { ( 0, -1) }
            elsif (dy == -1 && (ny  < 0 || a[ny][nx]!=nil)) { ( 1,  0) }
            else                                            { (dx, dy) })
        x = x+dx;
        y = y+dy;
    } * n**2;
    return a;
}
 
spiral(5).each { |row|
    row.map {"%3d" % _}.join(' ').say;
}