Last active
April 18, 2018 10:11
-
-
Save okjodom/d5ba3418b9003ad51caa79f7b8a1f5c0 to your computer and use it in GitHub Desktop.
Traverse a 2D Array in a circular clockwise path.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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