Day 11
This commit is contained in:
parent
8ccf9d77b9
commit
15a887bfa5
140
d11/input.txt
Normal file
140
d11/input.txt
Normal file
@ -0,0 +1,140 @@
|
||||
...........................#.............#..........#.........#..................#.......#.............................................#....
|
||||
..............#...........................................................................................#...............#.................
|
||||
.....................#......................................................................................................................
|
||||
...................................#................................#................................................#....................#.
|
||||
.................#.......................................................#..........#..................#.............................#......
|
||||
...............................................................................................#.................#..........................
|
||||
......................................................#........................#........................................#...................
|
||||
........#.....................................................#...........................#.................#...............................
|
||||
.........................................#.....#...............................................................................#............
|
||||
...........................#.........................................................#...................................................#..
|
||||
.....#................................................................#............................................................#........
|
||||
.............#..........................................#.......................................#.................#.........#...............
|
||||
............................................#...............................................................................................
|
||||
.#...............#.....................#....................................#.............................#................................#
|
||||
............................#....................#..........................................................................................
|
||||
...................................................................................................#..........#.............................
|
||||
.......#............#.........................................#........#.........................................................#..........
|
||||
..............#.................................................................#..........#............................#...................
|
||||
................................#........................................................................................................#..
|
||||
...............................................#.....................................................#...........#..........................
|
||||
#...............................................................#...........................................................................
|
||||
............#......#...................................#....................................................#.............#.........#.......
|
||||
.......................................................................................#....................................................
|
||||
....................................#........................#......#...........................#...........................................
|
||||
.........#.....#.............#............#.....................................#.....................................#.....................
|
||||
..........................................................................................................#.....#...............#..........#
|
||||
........................................................#...................................................................................
|
||||
..........................#.................................................................................................................
|
||||
....#..................................................................#..................................................#.................
|
||||
.....................#..........................................#...........................#.........#.....................................
|
||||
...........#.........................#.......................................#......#.................................................#.....
|
||||
#...............................................................................................#..................#............#...........
|
||||
............................#.............#.........#.......................................................................................
|
||||
........#...........................................................#.......................................................................
|
||||
.........................................................................#..........................#.......................................
|
||||
..#..........#............................................#.....#.....................#...............................#.....................
|
||||
.....................................#...............................................................................................#......
|
||||
....................#......................#....................................................................................#...........
|
||||
.....#......................................................................................................................................
|
||||
................................#....................#............................#.........................................................
|
||||
........................#......................................................................#.............................#..............
|
||||
.......................................................................#....................................................................
|
||||
..............#.................................#......................................................#.......#..................#.......#.
|
||||
............................................................#............................#..................................................
|
||||
..........................................................................................................................#.................
|
||||
..#.................#.........#............................................#.......#........................................................
|
||||
.......#.............................................#........................................#.......................#.....................
|
||||
...............................................................#.................................................................#..........
|
||||
...........................#...............#.......................................................#.....................................#..
|
||||
.................................#..............#...............................................................#...........................
|
||||
...............#........................................................................#...................................................
|
||||
.........................................................#......................................#..........#................................
|
||||
..#......................................#................................#.................................................................
|
||||
...............................#............................................................#..............................................#
|
||||
..........#........#............................................#...............................................................#...........
|
||||
................................................................................#..................#...........#..........#.................
|
||||
..................................#........#................................................................................................
|
||||
............................................................................................................................................
|
||||
.....................#............................................#............................#.......#.....................#..............
|
||||
............................#........................#.....................#..........#..........................#.....................#....
|
||||
.........................................................................................................................#..................
|
||||
.#.........#...........................#.......................#...................................#........................................
|
||||
................#........#.....................................................................................................#..........#.
|
||||
...........................................................................................#.................#..............................
|
||||
...............................#......................................#............................................#........................
|
||||
.........................................#.......#......................................................#...................................
|
||||
..........#..................................................#.................#............................................................
|
||||
#.......................#..............................................................#...........................................#.......#
|
||||
.................................#......................#........................................................#........#.................
|
||||
............................................................................................................................................
|
||||
...............................................#...............................................#............................................
|
||||
................#.....................#.......................................#.............................................................
|
||||
......................................................#...............#.....................................................................
|
||||
...................................................................................#.............................................#..........
|
||||
..................................................................#........#....................................#...........................
|
||||
.#.......................................................#.................................#............#...................................
|
||||
............................................................................................................................................
|
||||
........#.......................#................................................#.........................................#................
|
||||
..................#......#......................................................................#...........................................
|
||||
......................................#...............#..........#.....................................................................#....
|
||||
...#....................................................................................#...................................................
|
||||
...............#..............................#.............................#...............................................................
|
||||
...................................#..............................................................#.....#........................#.........#
|
||||
.......#............#...................................................................................................#...................
|
||||
...........................#.................................................................#................#.............................
|
||||
.....................................................#...............................................#......................................
|
||||
...........#..............................................#.................................................................................
|
||||
..............................................#.................#...............#.........#.................................................
|
||||
................#.......#...........#.................................#...................................#.................................
|
||||
.....................................................................................#...........#...................#......................
|
||||
........................................................#......................................................................#.......#....
|
||||
.....#......................#...............................................................................................................
|
||||
.............#........#..........................#..........................................................#.............#................#
|
||||
............................................................................................................................................
|
||||
........#............................#............................................#..........#..............................................
|
||||
............................................#...................................................................#...........................
|
||||
............................................................................................................................................
|
||||
..#..............#......#.........................................#...............................#.........................................
|
||||
....................................................#......................#.......................................................#......#.
|
||||
...................................#........................#................................................................#..............
|
||||
.....................................................................#...........#..........................................................
|
||||
...............#.............................#...........................................................#..................................
|
||||
..........#..............................................................................#.....#.................#..........................
|
||||
.....................................................................................................................................#......
|
||||
.#................................#.........................................................................#...............................
|
||||
........................#.........................................#......#.........#................#.......................................
|
||||
.................#........................................#..................................................................#..............
|
||||
........................................#...................................................................................................
|
||||
....#.....#........................................#............................................#...........................................
|
||||
............................................................................................................................................
|
||||
..............................................................................#.....................................#................#......
|
||||
.....................#................................................................#.........................................#...........
|
||||
.............................#.........#........#.........#.............#...........................#.......................................
|
||||
................................................................#.........................#..................#............#.............#...
|
||||
........#.......................................................................#...........................................................
|
||||
........................#..................#............................................................#...................................
|
||||
.....................................#.................................................#.........#................#.........................
|
||||
...................................................#.....................#....................................................#............#
|
||||
............................................................................................................................................
|
||||
................#..............................................#.................#............................#.............................
|
||||
....#........................#..........................#............#......................................................................
|
||||
....................................#........................................................#..............................................
|
||||
.......................#..........................................................................#.....#...........#............#..........
|
||||
........#..................................#................#.............#...........................................................#.....
|
||||
................................................#.......................................................................#..................#
|
||||
..................#.................................................................#.......................................................
|
||||
............#........................#...........................................................................#.............#............
|
||||
...#........................................................................................................................................
|
||||
..........................................#.................................#................#..............................................
|
||||
.......................#............................#.............#...................................................#.............#.......
|
||||
.................................#....................................................#........................#............................
|
||||
.................................................................................#........................................................#.
|
||||
..........................................................#.............................................#...................................
|
||||
...#............#...........................................................................................................................
|
||||
..............................................#...................................................#.........................................
|
||||
.........................................................................#.....#.......#.........................................#..........
|
||||
............#.........#......................................................................#........#.....................................
|
||||
...........................#........................................#........................................#.......................#......
|
||||
.....#.................................#..............#........#.....................................................#......................
|
||||
...............................#............................................#........#....................................#.................
|
138
d11/main.py
Normal file
138
d11/main.py
Normal file
@ -0,0 +1,138 @@
|
||||
from collections.abc import Generator
|
||||
from itertools import combinations, product
|
||||
from pathlib import Path
|
||||
from typing import NamedTuple
|
||||
|
||||
|
||||
class Point(NamedTuple):
|
||||
x: int
|
||||
y: int
|
||||
|
||||
def iter_adjacent(self, wrap=False) -> Generator["Point", None, None]:
|
||||
for offset in product((1, 0, -1), (1, 0, -1)):
|
||||
adj = Point(self.x + offset[0], self.y + offset[1])
|
||||
if adj == self:
|
||||
continue
|
||||
if not wrap and (adj.x < 0 or adj.y < 0):
|
||||
continue
|
||||
yield adj
|
||||
|
||||
def add_point(self, delta: "Point") -> "Point":
|
||||
return Point(self.x + delta.x, self.y + delta.y)
|
||||
|
||||
def add(self, x=0, y=0) -> "Point":
|
||||
return Point(self.x + x, self.y + y)
|
||||
|
||||
def dist(self, x=0, y=0, point: "Point|None" = None) -> int:
|
||||
if (x or y) and point:
|
||||
raise ValueError("Cannot provide both x and y and a point")
|
||||
|
||||
if point:
|
||||
x = point.x
|
||||
y = point.y
|
||||
|
||||
dx = abs(self.x - x)
|
||||
dy = abs(self.y - y)
|
||||
|
||||
return dx + dy
|
||||
|
||||
def __str__(self) -> str:
|
||||
return f"Point({self.x}, {self.y})"
|
||||
|
||||
|
||||
class Galaxy:
|
||||
def __init__(self, lines: list[str]):
|
||||
self.planets: set[Point] = set()
|
||||
|
||||
self.grid = [[x for x in row] for row in lines if row]
|
||||
self.expand_y: dict[int, int] = {}
|
||||
self.expand_x: dict[int, int] = {}
|
||||
|
||||
def find_planets(self) -> set[Point]:
|
||||
# Find planets
|
||||
for y, row in enumerate(self.grid):
|
||||
for x, c in enumerate(row):
|
||||
if c == "#":
|
||||
self.planets.add(Point(x, y))
|
||||
|
||||
return self.planets
|
||||
|
||||
def dist(self, a: Point, b: Point) -> int:
|
||||
d = a.dist(point=b)
|
||||
|
||||
for y in range(*sorted((a.y, b.y))):
|
||||
d += self.expand_y.get(y, 0)
|
||||
|
||||
for x in range(*sorted((a.x, b.x))):
|
||||
d += self.expand_x.get(x, 0)
|
||||
|
||||
return d
|
||||
|
||||
def virtual_expand(self, n=2) -> None:
|
||||
# Expand y
|
||||
self.expand_y = {
|
||||
y: n-1 for y, row in enumerate(self.grid) if all(c == "." for c in row)
|
||||
}
|
||||
|
||||
# Expand x
|
||||
self.expand_x = {
|
||||
x: n-1 for x in range(len(self.grid[0])) if all(row[x] == "." for row in self.grid)
|
||||
|
||||
}
|
||||
|
||||
def expand(self, n = 2) -> None:
|
||||
# Expand y
|
||||
og_y = len(self.grid)
|
||||
for y in range(og_y):
|
||||
i = og_y - y - 1
|
||||
row = self.grid[i]
|
||||
if all(c == "." for c in row):
|
||||
self.grid.insert(i, [str(n-1) for _ in row])
|
||||
|
||||
# Expand x
|
||||
og_x = len(self.grid[0])
|
||||
for x in range(og_x):
|
||||
i = og_x - x - 1
|
||||
col = [row[i] for row in self.grid]
|
||||
if all(c == "." or c.isnumeric() for c in col):
|
||||
for row in self.grid:
|
||||
row.insert(i, str(n-1))
|
||||
|
||||
def __str__(self) -> str:
|
||||
return "\n".join("".join(row) for row in self.grid)
|
||||
|
||||
|
||||
def part1(input: Path) -> int:
|
||||
galaxy = Galaxy(input.read_text().split("\n"))
|
||||
galaxy.expand()
|
||||
|
||||
galaxy.find_planets()
|
||||
|
||||
return sum(
|
||||
a.dist(point=b) for a, b in combinations(galaxy.planets, 2)
|
||||
)
|
||||
|
||||
|
||||
def part2(input: Path, n=1000000) -> int:
|
||||
galaxy = Galaxy(input.read_text().split("\n"))
|
||||
|
||||
galaxy.virtual_expand(n)
|
||||
|
||||
galaxy.find_planets()
|
||||
# print(galaxy.dist(Point(1, 0), Point(3, 1)))
|
||||
|
||||
return sum(
|
||||
galaxy.dist(a, b) for a, b in combinations(galaxy.planets, 2)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# input = Path("sample.txt")
|
||||
input = Path("input.txt")
|
||||
|
||||
result1 = part1(input)
|
||||
print("part 1", result1)
|
||||
|
||||
print("part 2 10", part2(input, 10))
|
||||
print("part 2 100", part2(input, 100))
|
||||
print("part 2 1M", part2(input))
|
10
d11/sample.txt
Normal file
10
d11/sample.txt
Normal file
@ -0,0 +1,10 @@
|
||||
...#......
|
||||
.......#..
|
||||
#.........
|
||||
..........
|
||||
......#...
|
||||
.#........
|
||||
.........#
|
||||
..........
|
||||
.......#..
|
||||
#...#.....
|
Loading…
Reference in New Issue
Block a user