2016-12-05 23:44:36 +01:00
|
|
|
|
func spiral(n) {
|
2017-09-23 10:01:46 +02:00
|
|
|
|
var (x, y, dx, dy, a) = (0, 0, 1, 0, [])
|
2016-12-05 23:44:36 +01:00
|
|
|
|
{ |i|
|
2017-09-23 10:01:46 +02:00
|
|
|
|
a[y][x] = i
|
|
|
|
|
|
var (nx, ny) = (x+dx, y+dy)
|
2016-12-05 23:44:36 +01:00
|
|
|
|
( 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] }
|
2017-09-23 10:01:46 +02:00
|
|
|
|
) » (\dx, \dy)
|
|
|
|
|
|
x = x+dx
|
|
|
|
|
|
y = y+dy
|
|
|
|
|
|
} << (1 .. n**2)
|
|
|
|
|
|
return a
|
2016-12-05 23:44:36 +01:00
|
|
|
|
}
|
2017-09-23 10:01:46 +02:00
|
|
|
|
|
2016-12-05 23:44:36 +01:00
|
|
|
|
spiral(5).each { |row|
|
2017-09-23 10:01:46 +02:00
|
|
|
|
row.map {"%3d" % _}.join(' ').say
|
2016-12-05 23:44:36 +01:00
|
|
|
|
}
|