Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from typing import Union
- Image = list[list[str]]
- class Tile:
- def __init__(self, id, image):
- self.id = id
- self.image: Image = image
- self.adjacent: dict[str, Union[Tile, None]] = {
- "l": None,
- "r": None,
- "t": None,
- "b": None,
- }
- self.solved = False
- self.dim: int = len(image)
- def __repr__(self):
- if self.solved:
- return self.inner_tile_str()
- return "\n".join(["".join(row) for row in self.image])
- def __str__(self):
- return repr(self)
- @property
- def edges(self) -> set[tuple[str]]:
- edges = set()
- for edge in [self.top_edge, self.bottom_edge, self.left_edge, self.right_edge]:
- edges.add(edge)
- return edges
- @property
- def reversed_edges(self):
- reversed_edges = set()
- for edge in self.edges:
- reversed_edges.add(tuple(reversed(edge)))
- return reversed_edges
- @property
- def all_edges(self):
- return set(self.edges).union(self.reversed_edges)
- @property
- def top_edge(self):
- return tuple(self.image[0])
- @property
- def bottom_edge(self):
- return tuple(self.image[-1])
- @property
- def left_edge(self):
- return tuple([row[0] for row in self.image])
- @property
- def right_edge(self):
- return tuple([row[-1] for row in self.image])
- def rotate(self, direction="r"):
- if direction == "r":
- self.image = list(zip(*self.image[::-1]))
- (
- self.adjacent["t"],
- self.adjacent["r"],
- self.adjacent["b"],
- self.adjacent["l"],
- ) = (
- self.adjacent["r"],
- self.adjacent["b"],
- self.adjacent["l"],
- self.adjacent["t"],
- )
- elif direction == "l":
- self.image = list(zip(*self.image))[::-1]
- (
- self.adjacent["t"],
- self.adjacent["r"],
- self.adjacent["b"],
- self.adjacent["l"],
- ) = (
- self.adjacent["l"],
- self.adjacent["t"],
- self.adjacent["r"],
- self.adjacent["b"],
- )
- def flip(self, axis="x"):
- if axis == "x":
- self.image = [x[::-1] for x in self.image]
- self.adjacent["l"], self.adjacent["r"] = (
- self.adjacent["r"],
- self.adjacent["l"],
- )
- elif axis == "y":
- self.image = self.image[::-1]
- self.adjacent["t"], self.adjacent["b"] = (
- self.adjacent["b"],
- self.adjacent["t"],
- )
- def is_adjacent(self, other):
- return bool(self.all_edges.intersection(other.all_edges))
- @property
- def long_string(self):
- return "".join(["".join(i) for i in self.image])
- @property
- def inner_tile(self):
- inner_tile = []
- for row in self.image[1:-1]:
- inner_tile.append(row[1:-1])
- return inner_tile
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement