17 lines
630 B
Python
17 lines
630 B
Python
def spiral(n):
|
|
dat = [[None] * n for i in range(n)]
|
|
le = [[i + 1, i + 1] for i in reversed(range(n))]
|
|
le = sum(le, [])[1:] # for n = 5 le will be [5, 4, 4, 3, 3, 2, 2, 1, 1]
|
|
dxdy = [[1, 0], [0, 1], [-1, 0], [0, -1]] * ((len(le) + 4) / 4) # long enough
|
|
x, y, val = -1, 0, -1
|
|
for steps, (dx, dy) in zip(le, dxdy):
|
|
x, y, val = x + dx, y + dy, val + 1
|
|
for j in range(steps):
|
|
dat[y][x] = val
|
|
if j != steps-1:
|
|
x, y, val = x + dx, y + dy, val + 1
|
|
return dat
|
|
|
|
for row in spiral(5): # calc spiral and print it
|
|
print ' '.join('%3s' % x for x in row)
|