tiles = """ Tile 2311: ..##.#..#. ##..#..... #...##..#. ####.#...# ##.##.###. ##...#.### .#.#.#..## ..#....#.. ###...#.#. ..###..### Tile 1951: #.##...##. #.####...# .....#..## #...###### .##.#....# .###.##### ###.##.##. .###....#. ..#.#..#.# #...##.#.. Tile 1171: ####...##. #..##.#..# ##.#..#.#. .###.####. ..###.#### .##....##. .#...####. #.##.####. ####..#... .....##... Tile 1427: ###.##.#.. .#..#.##.. .#.##.#..# #.#.#.##.# ....#...## ...##..##. ...#.##### .#.####.#. ..#..###.# ..##.#..#. Tile 1489: ##.#.#.... ..##...#.. .##..##... ..#...#... #####...#. #..#.#.#.# ...#.#.#.. ##.#...##. ..##.##.## ###.##.#.. Tile 2473: #....####. #..#.##... #.##..#... ######.#.# .#...#.#.# .######### .###.#..#. ########.# ##...##.#. ..###.#.#. Tile 2971: ..#.#....# #...###... #.#.###... ##.##..#.. .#####..## .#..####.# #..#.#..#. ..####.### ..#.#.###. ...#.#.#.# Tile 2729: ...#.#.#.# ####.#.... ..#.#..... ....#..#.# .##..##.#. .#.####... ####.#.#.. ##.####... ##..#.##.. #.##...##. Tile 3079: #.#.#####. .#..###### ..#....... ######.... ####.#..#. .#...#.##. #.#####.## ..#.###... ..#....... ..#.###... """.strip().split("\n\n") with open("input") as f: tiles = f.read().strip().split("\n\n") tiles = [tile.split("\n") for tile in tiles] tiles = {int(tile[0][5:-1]): tile[1:] for tile in tiles} print(len(tiles[2311]), len(tiles[2311][0])) print(len(tiles)) def borders(tile): return [tile[0], tile[-1], ''.join(tilex[0] for tilex in tile), ''.join(tilex[-1] for tilex in tile)] d = {i: [False]*4 for i in tiles} for i, a in tiles.items(): ax = borders(a) for j, b in tiles.items(): if i!=j: b = borders(b) for k, axx in enumerate(ax): for bx in b: if axx==bx or axx==bx[::-1]: d[i][k] = True break from math import prod print(prod(i for i, v in d.items() if v.count(False)==2))