day20: limit transformations to the absolute necessary
This commit is contained in:
parent
4c9e7f2838
commit
91f4d095f1
80
day20.py
80
day20.py
@ -48,6 +48,10 @@ class Tile:
|
||||
def flipVertically(self):
|
||||
self.image = flipVertically(self.image)
|
||||
|
||||
def printImage(self):
|
||||
for x in self.image:
|
||||
print(x)
|
||||
|
||||
|
||||
def rotateRight(image):
|
||||
return ["".join([x[line_no] for x in reversed(image)]) for line_no in range(len(image))]
|
||||
@ -115,30 +119,26 @@ def part2(test_mode=False):
|
||||
|
||||
# first - find correct orientation of corner piece
|
||||
possible_borders = getAllPossibleBorders(tile_dict)
|
||||
transformations = [
|
||||
tile_dict[corner_piece].flipHorizontally,
|
||||
tile_dict[corner_piece].flipVertically,
|
||||
tile_dict[corner_piece].flipHorizontally,
|
||||
tile_dict[corner_piece].rotateRight,
|
||||
tile_dict[corner_piece].flipHorizontally,
|
||||
tile_dict[corner_piece].flipVertically,
|
||||
tile_dict[corner_piece].flipHorizontally,
|
||||
]
|
||||
transformation_counter = 0
|
||||
found = False
|
||||
for _ in range(2):
|
||||
for _ in range(2):
|
||||
for _ in range(4):
|
||||
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
|
||||
|
||||
tile_dict[corner_piece].rotateRight()
|
||||
|
||||
if found:
|
||||
break
|
||||
else:
|
||||
tile_dict[corner_piece].flipHorizontally()
|
||||
|
||||
if found:
|
||||
break
|
||||
while not found:
|
||||
if possible_borders.count(tile_dict[corner_piece].getCurrentBorders()[0]) == 1 \
|
||||
and possible_borders.count(tile_dict[corner_piece].getCurrentBorders()[3]) == 1:
|
||||
found = True
|
||||
else:
|
||||
tile_dict[corner_piece].flipVertically()
|
||||
transformations[transformation_counter]()
|
||||
transformation_counter += 1
|
||||
|
||||
# flip diagonally to match with example from aoc webpage
|
||||
tile_dict[corner_piece].rotateRight()
|
||||
tile_dict[corner_piece].flipVertically()
|
||||
assert found is True
|
||||
|
||||
full_image = []
|
||||
for y in range(borderlen):
|
||||
@ -157,28 +157,26 @@ def part2(test_mode=False):
|
||||
for possible_tile in all_pieces:
|
||||
if check_border in tile_dict[possible_tile].getPossibleBorderList():
|
||||
# found my piece ... now orientate it correctly
|
||||
transformations = [
|
||||
tile_dict[possible_tile].flipHorizontally,
|
||||
tile_dict[possible_tile].flipVertically,
|
||||
tile_dict[possible_tile].flipHorizontally,
|
||||
tile_dict[possible_tile].rotateRight,
|
||||
tile_dict[possible_tile].flipHorizontally,
|
||||
tile_dict[possible_tile].flipVertically,
|
||||
tile_dict[possible_tile].flipHorizontally,
|
||||
]
|
||||
transformation_counter = 0
|
||||
oriented = False
|
||||
for _ in range(2):
|
||||
for _ in range(2):
|
||||
for _ in range(4):
|
||||
if (x == 0 and tile_dict[possible_tile].getCurrentBorders()[0] == check_border)\
|
||||
or (x != 0 and tile_dict[possible_tile].getCurrentBorders()[3] == check_border):
|
||||
oriented = True
|
||||
full_image[y].append(possible_tile)
|
||||
all_pieces.remove(possible_tile)
|
||||
break
|
||||
|
||||
tile_dict[possible_tile].rotateRight()
|
||||
|
||||
if oriented:
|
||||
break
|
||||
else:
|
||||
tile_dict[possible_tile].flipVertically()
|
||||
|
||||
if oriented:
|
||||
break
|
||||
while not oriented:
|
||||
if (x == 0 and tile_dict[possible_tile].getCurrentBorders()[0] == check_border) \
|
||||
or (x != 0 and tile_dict[possible_tile].getCurrentBorders()[3] == check_border):
|
||||
oriented = True
|
||||
full_image[y].append(possible_tile)
|
||||
all_pieces.remove(possible_tile)
|
||||
else:
|
||||
tile_dict[possible_tile].flipHorizontally()
|
||||
transformations[transformation_counter]()
|
||||
transformation_counter += 1
|
||||
|
||||
# now that we have the full picture, assemble the borderless full image
|
||||
borderless_image = []
|
||||
|
||||
Loading…
Reference in New Issue
Block a user