66 lines
1.6 KiB
Python
66 lines
1.6 KiB
Python
|
import sys
|
||
|
|
||
|
from grid import Grid
|
||
|
|
||
|
def main():
|
||
|
lines = [line.rstrip() for line in sys.stdin]
|
||
|
g = Grid(value_factory=int)
|
||
|
|
||
|
# Part 1
|
||
|
for line in lines:
|
||
|
x, y = 0, 0
|
||
|
while line:
|
||
|
if line[0] in ("e", "w"):
|
||
|
x, y = move(x, y, line[0])
|
||
|
line = line[1:]
|
||
|
else:
|
||
|
x, y = move(x, y, line[:2])
|
||
|
line = line[2:]
|
||
|
g.setv(x, y, abs(g.getv(x, y) - 1))
|
||
|
print("Black tiles:", sum(v for _, _, v in g.values_gen()))
|
||
|
|
||
|
# Part 2 aka stop using this grid class it's horrible
|
||
|
for _ in range(100):
|
||
|
expand(g)
|
||
|
yagol(g)
|
||
|
print("Black tiles p2:", sum(v for _, _, v in g.values_gen()))
|
||
|
|
||
|
def move(x, y, d):
|
||
|
if d in ("e", "w"):
|
||
|
x += 1 if d == "e" else -1
|
||
|
else:
|
||
|
dy, dx = d[0], d[1]
|
||
|
if y % 2 == 0 and dx == "w":
|
||
|
x -= 1
|
||
|
elif y % 2 == 1 and dx == "e":
|
||
|
x += 1
|
||
|
y += 1 if dy == "s" else -1
|
||
|
return x, y
|
||
|
|
||
|
D = ["e", "se", "sw", "w", "nw", "ne"]
|
||
|
|
||
|
def expand(g):
|
||
|
for x, y, _ in list(g.values_gen()):
|
||
|
for d in D:
|
||
|
dx, dy = move(x, y, d)
|
||
|
if not g.hasv(dx, dy):
|
||
|
g.setv(dx, dy, 0)
|
||
|
|
||
|
def yagol(g):
|
||
|
c = {}
|
||
|
for x, y, v in g.values_gen():
|
||
|
bn = 0
|
||
|
for d in D:
|
||
|
nx, ny = move(x, y, d)
|
||
|
if g.hasv(nx, ny):
|
||
|
bn += g.getv(nx, ny)
|
||
|
if v == 1 and (bn == 0 or bn > 2):
|
||
|
c[(x, y)] = 0
|
||
|
elif v == 0 and bn == 2:
|
||
|
c[(x, y)] = 1
|
||
|
for (x, y), v in c.items():
|
||
|
g.setv(x, y, v)
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|