From 961fc2a8cbd5017cb3a680e07c29b2d04b92d620 Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Sun, 20 Dec 2020 20:19:32 +0100 Subject: [PATCH] day20: don't re-build possible border lists every loop --- day20.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/day20.py b/day20.py index 28496e6..6693067 100644 --- a/day20.py +++ b/day20.py @@ -65,29 +65,28 @@ def flipVertically(image): return ["".join(x for x in reversed(y)) for y in image] -def getAllPossibleBorders(tile_dict, exception): +def getAllPossibleBorders(tile_dict): all_possible_borders = [] for tile_id, tile in tile_dict.items(): - if tile_id != exception: - all_possible_borders.extend(tile.getPossibleBorderList()) + all_possible_borders.extend(tile.getPossibleBorderList()) return all_possible_borders def getCornerPieces(tile_dict, only_get_first_piece=False): corner_pieces = [] + all_borders = getAllPossibleBorders(tile_dict) for tile_id, tile in tile_dict.items(): - impossible_borders = 0 - all_other_borders = getAllPossibleBorders(tile_dict, tile_id) + single_borders = 0 for border in tile.getPossibleBorderList(): - if border not in all_other_borders: - impossible_borders += 1 + single_borders += all_borders.count(border) - 1 - # we need to find the tiles where 2 borders (and their reverse) don't match any other border - if impossible_borders == 4: + if single_borders == 4: if only_get_first_piece: return tile_id corner_pieces.append(tile_id) + if len(corner_pieces) == 4: + break return corner_pieces @@ -115,13 +114,13 @@ def part2(test_mode=False): all_pieces.remove(corner_piece) # first - find correct orientation of corner piece - possible_borders = getAllPossibleBorders(tile_dict, corner_piece) + possible_borders = getAllPossibleBorders(tile_dict) found = False for _ in range(2): for _ in range(2): for _ in range(4): - if tile_dict[corner_piece].getCurrentBorders()[0] not in possible_borders \ - and tile_dict[corner_piece].getCurrentBorders()[3] not in possible_borders: + if possible_borders.count(tile_dict[corner_piece].getCurrentBorders()[0]) == 1 \ + and possible_borders.count(tile_dict[corner_piece].getCurrentBorders()[3]) == 1: found = True break