Skip to content

Instantly share code, notes, and snippets.

@okjodom
Last active April 18, 2018 10:11
Show Gist options
  • Select an option

  • Save okjodom/d5ba3418b9003ad51caa79f7b8a1f5c0 to your computer and use it in GitHub Desktop.

Select an option

Save okjodom/d5ba3418b9003ad51caa79f7b8a1f5c0 to your computer and use it in GitHub Desktop.
Traverse a 2D Array in a circular clockwise path.
import unittest
def traverse(board, start):
'''
Traverse a 2d array in an anti-clockwise manner
array: board
start[r,c] : start position
'''
r, c = start
size = len(board[0])
readout = []
# traverse the outer cells layer by layer, clockwise
for i in range(1, size): # layer control
# traverse right column
if c+i < size:
for j in range(-i, i+1):
if r+j >= 0 and r+j < size:
readout.append(board[r+j][c+i])
else: break
# traverse bottom row
if r+i < size:
for j in range(i-1, -i-1, -1):
if c+j >= 0 and c+j < size:
readout.append(board[r+i][c+j])
else: break
# traverse left column
if c-i >= 0:
for j in range(i-1, -i-1, -1):
if r+j >= 0 and r+j < size:
readout.append(board[r+j][c-i])
else: break
# traverse top row
if r-i >= 0:
for j in range(-i+1, i):
if c+j >= 0 and c+j < size:
readout.append(board[r-i][c+j])
else: break
return readout
class TestTraversal(unittest.TestCase):
arr = [
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
]
def test_traverse_from_center_point(self):
self.assertEqual(traverse(self.arr, [2, 2]), [9, 14, 19, 18, 17, 12, 7, 8, 5, 10, 15, 20, 25,24,23,22,21,16,11,6,1,2,3,4])
def test_traverse_from_random_point(self):
# Fails
self.assertEqual(traverse(self.arr, [2, 4]), [])
if __name__ == '__main__':
unittest.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment