day20: don't re-build possible border lists every loop

This commit is contained in:
Stefan Harmuth 2020-12-20 20:19:32 +01:00
parent db841e474f
commit 961fc2a8cb

View File

@ -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