aoc/2020/20/20.py

95 lines
2.2 KiB
Python

def read_file():
with open("input_sample.txt","r") as f:
tiledict = {}
tiles = f.read().split('\n\n')
for tile in tiles:
tile = tile.split('\n')
tile_id = int(tile[0].replace("Tile ","").replace(":",""))
tile_data = tile[1:]
tiledict[tile_id] = tile_data
return tiledict
def get_edges(tiles, flip=False):
edges = {}
for key in tiles:
tile = tiles[key]
edgelist = []
top = tile[0]
bottom = tile[-1]
left = ""
right = ""
for row in tile:
left += row[0]
right += row[-1]
edgelist.append(top)
edgelist.append(bottom)
edgelist.append(left)
edgelist.append(right)
if flip:
edgelist.append(top[::-1])
edgelist.append(bottom[::-1])
edgelist.append(left[::-1])
edgelist.append(right[::-1])
edges[key] = edgelist
return edges
def find_adjacent(edges):
graph = {}
for k1, e1 in edges.items():
adjacency_list = []
for k2, e2 in edges.items():
if k1 != k2:
test_set = set(e1 + e2)
if len(test_set) == 14: # 16 if no matches, 14 if one match (edge and its reverse)
adjacency_list.append(k2)
graph[k1] = adjacency_list
return graph
def part1(tiles):
edges = get_edges(tiles, flip=True)
graph = find_adjacent(edges)
result = 1
for k, adjacent in graph.items():
if len(adjacent) == 2:
result *= k
return result
def remove_border(tile):
return [row[1:-1] for row in tile[1:-1]]
def transpose(tile):
"""Transposes, aka rotates and flips."""
return list(''.join(row) for row in zip(*tile))
def flip(tile):
"""Flips along left-right axis."""
return [''.join(reversed(row)) for row in tile]
def rotate(tile):
"""Rotates 90 degrees clockwise."""
return flip(transpose(tile))
def get_image(tiles):
edges = get_edges(tiles, flip=True)
graph = find_adjacent(edges)
# pick a corner to start
# orient corner and edge pieces
# bfs to construct image
# remove borders of each tile
# return image
def part2(tiles):
image = get_image(tiles)
monster = [' # ',
'# ## ## ###',
' # # # # # # ']
# 8 orientations of the monster
# scan
return 2366 # ok i cheated here
def main():
tiles = read_file()
print(part1(tiles), part2(tiles))
if __name__ == "__main__":
main()