diff options
| -rw-r--r-- | aoc/datastructures.py | 23 | ||||
| -rw-r--r-- | day9/__init__.py | 18 |
2 files changed, 18 insertions, 23 deletions
diff --git a/aoc/datastructures.py b/aoc/datastructures.py index c49f564..81a68e4 100644 --- a/aoc/datastructures.py +++ b/aoc/datastructures.py | |||
| @@ -3,25 +3,28 @@ from collections import namedtuple | |||
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | class Coordinate(namedtuple("Coordinate", ["x", "y"])): | 5 | class Coordinate(namedtuple("Coordinate", ["x", "y"])): |
| 6 | def __sub__(self, other: "Coordinate"): | 6 | def __sub__(self, other: "Coordinate") -> "Coordinate": |
| 7 | return Coordinate(self.x - other.x, self.y - other.y) | 7 | return Coordinate(self.x - other.x, self.y - other.y) |
| 8 | 8 | ||
| 9 | def __add__(self, other: "Coordinate"): | 9 | def __add__(self, other: "Coordinate") -> "Coordinate": |
| 10 | return Coordinate(self.x + other.x, self.y + other.y) | 10 | return Coordinate(self.x + other.x, self.y + other.y) |
| 11 | 11 | ||
| 12 | def manhattan_distance(self, other: "Coordinate"): | 12 | def manhattan_distance(self, other: "Coordinate") -> int: |
| 13 | return abs(self.x - other.x) + abs(self.y - other.y) | 13 | return abs(self.x - other.x) + abs(self.y - other.y) |
| 14 | 14 | ||
| 15 | @property | 15 | @property |
| 16 | def polarity_x(self): | 16 | def polarity(self) -> "Coordinate": |
| 17 | try: | 17 | try: |
| 18 | return abs(self.x) / self.x | 18 | px = abs(self.x) / self.x |
| 19 | except ZeroDivisionError: | 19 | except ZeroDivisionError: |
| 20 | return 0 | 20 | px = 0 |
| 21 | 21 | ||
| 22 | @property | ||
| 23 | def polarity_y(self): | ||
| 24 | try: | 22 | try: |
| 25 | return abs(self.y) / self.y | 23 | py = abs(self.y) / self.y |
| 26 | except ZeroDivisionError: | 24 | except ZeroDivisionError: |
| 27 | return 0 | 25 | py = 0 |
| 26 | |||
| 27 | return Coordinate( | ||
| 28 | px, | ||
| 29 | py, | ||
| 30 | ) | ||
diff --git a/day9/__init__.py b/day9/__init__.py index a2d6d82..ba29708 100644 --- a/day9/__init__.py +++ b/day9/__init__.py | |||
| @@ -36,26 +36,18 @@ class Assignment(BaseAssignment, ABC): | |||
| 36 | if abs(delta.x) < 2 and abs(delta.y) < 2: | 36 | if abs(delta.x) < 2 and abs(delta.y) < 2: |
| 37 | return tail | 37 | return tail |
| 38 | elif abs(delta.x) > 1 and delta.y == 0: | 38 | elif abs(delta.x) > 1 and delta.y == 0: |
| 39 | return tail + Coordinate( | 39 | return tail + delta - delta.polarity |
| 40 | delta.x - delta.polarity_x, | ||
| 41 | 0, | ||
| 42 | ) | ||
| 43 | elif abs(delta.x) > 1 and abs(delta.y) == 1: | 40 | elif abs(delta.x) > 1 and abs(delta.y) == 1: |
| 44 | return tail + Coordinate(delta.x - delta.polarity_x, delta.y) | 41 | return tail + Coordinate(delta.x - delta.polarity.x, delta.y) |
| 45 | elif abs(delta.y) > 1 and delta.x == 0: | 42 | elif abs(delta.y) > 1 and delta.x == 0: |
| 46 | return tail + Coordinate( | 43 | return tail + delta - delta.polarity |
| 47 | 0, | ||
| 48 | delta.y - delta.polarity_y, | ||
| 49 | ) | ||
| 50 | elif abs(delta.y) > 1 and abs(delta.x) == 1: | 44 | elif abs(delta.y) > 1 and abs(delta.x) == 1: |
| 51 | return tail + Coordinate( | 45 | return tail + Coordinate( |
| 52 | delta.x, | 46 | delta.x, |
| 53 | delta.y - delta.polarity_y, | 47 | delta.y - delta.polarity.y, |
| 54 | ) | 48 | ) |
| 55 | elif abs(delta.x) > 1 and abs(delta.y) > 1: | 49 | elif abs(delta.x) > 1 and abs(delta.y) > 1: |
| 56 | return tail + Coordinate( | 50 | return tail + delta - delta.polarity |
| 57 | delta.x - delta.polarity_x, delta.y - delta.polarity_y | ||
| 58 | ) | ||
| 59 | 51 | ||
| 60 | def tail_positions(self, input: Iterator[str], length: int) -> Iterator[Coordinate]: | 52 | def tail_positions(self, input: Iterator[str], length: int) -> Iterator[Coordinate]: |
| 61 | knots = [Coordinate(0, 0) for _ in range(length)] | 53 | knots = [Coordinate(0, 0) for _ in range(length)] |
