Solve 2019 day 24
This commit is contained in:
107
2019/d24.py
Normal file
107
2019/d24.py
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
from lib import get_data, Grid2D, add2
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
|
||||||
|
data = get_data(__file__)
|
||||||
|
|
||||||
|
g = Grid2D(data)
|
||||||
|
seen = set()
|
||||||
|
while True:
|
||||||
|
h = g.hash()
|
||||||
|
if h in seen:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
seen.add(h)
|
||||||
|
|
||||||
|
gn = g.clone_with_val(".")
|
||||||
|
for r in range(g.n_rows):
|
||||||
|
for c in range(g.n_cols):
|
||||||
|
p = (r, c)
|
||||||
|
nb_bugs = sum(1 for nb in g.neighbors_ort(p) if g[nb] == "#")
|
||||||
|
if g[p] == "#" and nb_bugs == 1:
|
||||||
|
gn[p] = "#"
|
||||||
|
if g[p] == "." and nb_bugs in [1, 2]:
|
||||||
|
gn[p] = "#"
|
||||||
|
g = gn
|
||||||
|
|
||||||
|
|
||||||
|
t = 0
|
||||||
|
p = 1
|
||||||
|
for r in range(g.n_rows):
|
||||||
|
for c in range(g.n_cols):
|
||||||
|
if g[(r, c)] == "#":
|
||||||
|
t += p
|
||||||
|
p *= 2
|
||||||
|
print(t)
|
||||||
|
|
||||||
|
N = (-1, 0)
|
||||||
|
E = (0, 1)
|
||||||
|
S = (1, 0)
|
||||||
|
W = (0, -1)
|
||||||
|
DIRS = [N, E, S, W]
|
||||||
|
ROW, COL = 0, 1
|
||||||
|
|
||||||
|
# data = get_data(__file__)
|
||||||
|
g = Grid2D(data)
|
||||||
|
bugs = [(0, r, c) for (r, c) in g.find("#")]
|
||||||
|
middle = (g.n_rows // 2, g.n_cols // 2)
|
||||||
|
rows, cols = g.n_rows, g.n_cols
|
||||||
|
|
||||||
|
|
||||||
|
def get_edge(side):
|
||||||
|
edges = {
|
||||||
|
S: [(0, c) for c in range(cols)],
|
||||||
|
N: [(rows - 1, c) for c in range(cols)],
|
||||||
|
W: [(r, cols - 1) for r in range(rows)],
|
||||||
|
E: [(r, 0) for r in range(rows)],
|
||||||
|
}
|
||||||
|
return edges[side]
|
||||||
|
|
||||||
|
|
||||||
|
def get_neighbors(pos):
|
||||||
|
level, row, col = pos
|
||||||
|
neighbors = []
|
||||||
|
|
||||||
|
for d in DIRS:
|
||||||
|
nb = add2((row, col), d)
|
||||||
|
if nb == middle:
|
||||||
|
for ir, ic in get_edge(d):
|
||||||
|
neighbors.append((level - 1, ir, ic))
|
||||||
|
elif nb[ROW] in {-1, rows} or nb[COL] in {-1, cols}:
|
||||||
|
nr, nc = nb
|
||||||
|
if nr == -1:
|
||||||
|
neighbors.append((level + 1, *add2(middle, N)))
|
||||||
|
if nr == rows:
|
||||||
|
neighbors.append((level + 1, *add2(middle, S)))
|
||||||
|
if nc == -1:
|
||||||
|
neighbors.append((level + 1, *add2(middle, W)))
|
||||||
|
if nc == cols:
|
||||||
|
neighbors.append((level + 1, *add2(middle, E)))
|
||||||
|
else:
|
||||||
|
nr, nc = nb
|
||||||
|
neighbors.append((level, nr, nc))
|
||||||
|
return neighbors
|
||||||
|
|
||||||
|
|
||||||
|
assert len(get_neighbors((0, 1, 1))) == 4
|
||||||
|
assert len(get_neighbors((0, 3, 3))) == 4
|
||||||
|
assert len(get_neighbors((0, 0, 3))) == 4
|
||||||
|
assert len(get_neighbors((0, 0, 4))) == 4
|
||||||
|
assert len(get_neighbors((0, 2, 3))) == 8
|
||||||
|
|
||||||
|
for _ in range(200):
|
||||||
|
neighbors = defaultdict(int)
|
||||||
|
current_bugs = set(bugs)
|
||||||
|
for pos in bugs:
|
||||||
|
for nb in get_neighbors(pos):
|
||||||
|
neighbors[nb] += 1
|
||||||
|
|
||||||
|
new_bugs = []
|
||||||
|
for pos, count in neighbors.items():
|
||||||
|
if pos in current_bugs and count == 1:
|
||||||
|
new_bugs.append(pos)
|
||||||
|
if pos not in current_bugs and count in [1, 2]:
|
||||||
|
new_bugs.append(pos)
|
||||||
|
bugs = new_bugs
|
||||||
|
|
||||||
|
print(len(bugs))
|
||||||
@@ -139,7 +139,8 @@ Solutions and utility script for Advent of Code challenges in Python.
|
|||||||
- Day 21: days (But it was super fun!)
|
- Day 21: days (But it was super fun!)
|
||||||
- Day 22: days (Needed some help...)
|
- Day 22: days (Needed some help...)
|
||||||
- Day 23: 23:13 (Still too slow even though my int computer was in good shape...)
|
- Day 23: 23:13 (Still too slow even though my int computer was in good shape...)
|
||||||
- Day 14:
|
- Day 24: 53:00 (Can I ever even get points at all?)
|
||||||
|
- Day 25:
|
||||||
|
|
||||||
## AoC 2020
|
## AoC 2020
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user