Sep-28-2020, 03:31 PM
(This post was last modified: Sep-28-2020, 03:31 PM by Gribouillis.)
There is a recursive implementation
# snail.py LEFT, DOWN, RIGHT, UP = range(4) def snail(start, n, m, dir): nd = (dir + 1) % 4 # next dir if not n: return [] elif not m: return [list() for i in range(n)] if dir == LEFT: s = snail(start + m, n-1, m, nd) s.insert(0, list(range(start, start + m))) elif dir == DOWN: s = snail(start + n, n, m-1, nd) for i, row in enumerate(s): row.append(start+i) elif dir == RIGHT: s = snail(start + m, n-1, m, nd) s.append(list(range(start + m - 1, start - 1, -1))) elif dir == UP: s = snail(start + n, n, m-1, nd) for i, row in enumerate(s): row.insert(0, start + n - 1 - i) return s if __name__ == '__main__': for row in snail(1, 5, 5, LEFT): print(row)
Output:[1, 2, 3, 4, 5]
[16, 17, 18, 19, 6]
[15, 24, 25, 20, 7]
[14, 23, 22, 21, 8]
[13, 12, 11, 10, 9]
I also have another MUCH shorter recursive implementation.