90 lines
2.0 KiB
Python
90 lines
2.0 KiB
Python
from lib import get_data, Grid2D, add2
|
|
|
|
data = """L.LL.LL.LL
|
|
LLLLLLL.LL
|
|
L.L.L..L..
|
|
LLLL.LL.LL
|
|
L.LL.LL.LL
|
|
L.LLLLL.LL
|
|
..L.L.....
|
|
LLLLLLLLLL
|
|
L.LLLLLL.L
|
|
L.LLLLL.LL"""
|
|
|
|
|
|
def part_1(data):
|
|
g = Grid2D(data)
|
|
seen = set()
|
|
while True:
|
|
h = g.hash()
|
|
if h in seen:
|
|
break
|
|
seen.add(h)
|
|
|
|
ng = g.clone_with_val(".")
|
|
for r in range(g.n_rows):
|
|
for c in range(g.n_cols):
|
|
p = (r, c)
|
|
s = g[p]
|
|
if s == ".":
|
|
continue
|
|
occupied = sum([1 if g[nb] == "#" else 0 for nb in g.neighbors_adj(p)])
|
|
if s == "L" and occupied == 0:
|
|
ng[p] = "#"
|
|
elif s == "#" and occupied >= 4:
|
|
ng[p] = "L"
|
|
else:
|
|
ng[p] = s
|
|
g = ng
|
|
print(len(g.find("#")))
|
|
|
|
|
|
def part_2(data):
|
|
g = Grid2D(data)
|
|
seen = set()
|
|
while True:
|
|
h = g.hash()
|
|
if h in seen:
|
|
break
|
|
seen.add(h)
|
|
|
|
ng = g.clone_with_val(".")
|
|
for r in range(g.n_rows):
|
|
for c in range(g.n_cols):
|
|
p = (r, c)
|
|
s = g[p]
|
|
if s == ".":
|
|
continue
|
|
|
|
occupied = 0
|
|
for dir in g.COORDS_ORTH + g.COORDS_DIAG:
|
|
np = p
|
|
while True:
|
|
np = add2(np, dir)
|
|
if not g.contains(np):
|
|
break
|
|
elif g[np] == "#":
|
|
occupied += 1
|
|
break
|
|
elif g[np] == "L":
|
|
break
|
|
|
|
if s == "L" and occupied == 0:
|
|
ng[p] = "#"
|
|
elif s == "#" and occupied >= 5:
|
|
ng[p] = "L"
|
|
else:
|
|
ng[p] = s
|
|
g = ng
|
|
print(len(g.find("#")))
|
|
|
|
|
|
def main():
|
|
data = get_data(__file__)
|
|
part_1(data)
|
|
part_2(data)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|