From c70fb6b6d0c866a41757334dc51a925cea7a9672 Mon Sep 17 00:00:00 2001 From: Marco Bonelli Date: Fri, 11 Dec 2020 06:44:33 +0100 Subject: [PATCH] Utils/algo: faster grid neighbors bound checking --- utils/algorithms.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/utils/algorithms.py b/utils/algorithms.py index 4c09b69..d8029b1 100644 --- a/utils/algorithms.py +++ b/utils/algorithms.py @@ -27,14 +27,21 @@ def _grid_neighbors(deltas): ''' def g(grid, r, c, avoid='#'): '''Get neighbors of a cell in a 2D grid (matrix) i.e. list of lists or - similar. Performs bounds checking. + similar. Performs bounds checking. Grid is assumed to be rectangular. ''' - width = len(grid) - height = len(grid[0]) - - for dr, dc in deltas: - rr, cc = (r + dr, c + dc) - if 0 <= rr < width and 0 <= cc < height: + maxr = len(grid) - 1 + maxc = len(grid[0]) - 1 + check = r == 0 or r == maxr or c == 0 or c == maxc + + if check: + for dr, dc in deltas: + rr, cc = (r + dr, c + dc) + if 0 <= rr <= maxr and 0 <= cc <= maxc: + if grid[rr][cc] not in avoid: + yield (rr, cc) + else: + for dr, dc in deltas: + rr, cc = (r + dr, c + dc) if grid[rr][cc] not in avoid: yield (rr, cc)