day20: don't re-build possible border lists every loop
This commit is contained in:
parent
db841e474f
commit
961fc2a8cb
23
day20.py
23
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
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user