95 lines
2.2 KiB
Python
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() |