Advertisement
Guest User

Advent of Code Day 20 - tile.py

a guest
Dec 27th, 2020
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.17 KB | None | 0 0
  1. from typing import Union
  2.  
  3. Image = list[list[str]]
  4.  
  5.  
  6. class Tile:
  7.     def __init__(self, id, image):
  8.         self.id = id
  9.         self.image: Image = image
  10.         self.adjacent: dict[str, Union[Tile, None]] = {
  11.             "l": None,
  12.             "r": None,
  13.             "t": None,
  14.             "b": None,
  15.         }
  16.         self.solved = False
  17.         self.dim: int = len(image)
  18.  
  19.     def __repr__(self):
  20.         if self.solved:
  21.             return self.inner_tile_str()
  22.         return "\n".join(["".join(row) for row in self.image])
  23.  
  24.     def __str__(self):
  25.         return repr(self)
  26.  
  27.     @property
  28.     def edges(self) -> set[tuple[str]]:
  29.         edges = set()
  30.         for edge in [self.top_edge, self.bottom_edge, self.left_edge, self.right_edge]:
  31.             edges.add(edge)
  32.         return edges
  33.  
  34.     @property
  35.     def reversed_edges(self):
  36.         reversed_edges = set()
  37.         for edge in self.edges:
  38.             reversed_edges.add(tuple(reversed(edge)))
  39.         return reversed_edges
  40.  
  41.     @property
  42.     def all_edges(self):
  43.         return set(self.edges).union(self.reversed_edges)
  44.  
  45.     @property
  46.     def top_edge(self):
  47.         return tuple(self.image[0])
  48.  
  49.     @property
  50.     def bottom_edge(self):
  51.         return tuple(self.image[-1])
  52.  
  53.     @property
  54.     def left_edge(self):
  55.         return tuple([row[0] for row in self.image])
  56.  
  57.     @property
  58.     def right_edge(self):
  59.         return tuple([row[-1] for row in self.image])
  60.  
  61.     def rotate(self, direction="r"):
  62.         if direction == "r":
  63.             self.image = list(zip(*self.image[::-1]))
  64.             (
  65.                 self.adjacent["t"],
  66.                 self.adjacent["r"],
  67.                 self.adjacent["b"],
  68.                 self.adjacent["l"],
  69.             ) = (
  70.                 self.adjacent["r"],
  71.                 self.adjacent["b"],
  72.                 self.adjacent["l"],
  73.                 self.adjacent["t"],
  74.             )
  75.         elif direction == "l":
  76.             self.image = list(zip(*self.image))[::-1]
  77.             (
  78.                 self.adjacent["t"],
  79.                 self.adjacent["r"],
  80.                 self.adjacent["b"],
  81.                 self.adjacent["l"],
  82.             ) = (
  83.                 self.adjacent["l"],
  84.                 self.adjacent["t"],
  85.                 self.adjacent["r"],
  86.                 self.adjacent["b"],
  87.             )
  88.  
  89.     def flip(self, axis="x"):
  90.         if axis == "x":
  91.             self.image = [x[::-1] for x in self.image]
  92.             self.adjacent["l"], self.adjacent["r"] = (
  93.                 self.adjacent["r"],
  94.                 self.adjacent["l"],
  95.             )
  96.         elif axis == "y":
  97.             self.image = self.image[::-1]
  98.             self.adjacent["t"], self.adjacent["b"] = (
  99.                 self.adjacent["b"],
  100.                 self.adjacent["t"],
  101.             )
  102.  
  103.     def is_adjacent(self, other):
  104.         return bool(self.all_edges.intersection(other.all_edges))
  105.  
  106.     @property
  107.     def long_string(self):
  108.         return "".join(["".join(i) for i in self.image])
  109.  
  110.     @property
  111.     def inner_tile(self):
  112.         inner_tile = []
  113.         for row in self.image[1:-1]:
  114.             inner_tile.append(row[1:-1])
  115.         return inner_tile
  116.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement