#!/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;
}