84 lines
1.7 KiB
Python
84 lines
1.7 KiB
Python
|
|
from output import answer
|
||
|
|
|
||
|
|
n = 14
|
||
|
|
title = "Parabolic Reflector Dish"
|
||
|
|
|
||
|
|
|
||
|
|
@answer(1, "Total initial load on the northern beams: {}")
|
||
|
|
def part_1(presolved):
|
||
|
|
return presolved[0]
|
||
|
|
|
||
|
|
|
||
|
|
@answer(2, "After some humble load testing, the northern beam load is {}")
|
||
|
|
def part_2(presolved):
|
||
|
|
return presolved[1]
|
||
|
|
|
||
|
|
|
||
|
|
BAEST = 1000_000_000
|
||
|
|
|
||
|
|
|
||
|
|
def presolve(data):
|
||
|
|
m = [list(l) for l in data.split()]
|
||
|
|
s = len(m[0])
|
||
|
|
m1 = _tilt(m)
|
||
|
|
|
||
|
|
p1 = sum(sum((s - w) * o.count("O") for o in r) for w, r in enumerate(m1))
|
||
|
|
|
||
|
|
def impl(rc):
|
||
|
|
return "".join(["".join(r) for r in rc])
|
||
|
|
|
||
|
|
i = 0
|
||
|
|
seen = []
|
||
|
|
while True:
|
||
|
|
i += 1
|
||
|
|
for _ in range(4):
|
||
|
|
m = _tilt(m)
|
||
|
|
m = _rotate(m)
|
||
|
|
im = impl(m)
|
||
|
|
if im in seen:
|
||
|
|
break
|
||
|
|
else:
|
||
|
|
seen.append(im)
|
||
|
|
m2 = m
|
||
|
|
c = seen.index(im) + 1
|
||
|
|
for _ in range((BAEST - i) % (i - c)):
|
||
|
|
for j in range(4):
|
||
|
|
m2 = _tilt(m2)
|
||
|
|
m2 = _rotate(m2)
|
||
|
|
p2 = sum(sum((s - w) * o.count("O") for o in r) for w, r in enumerate(m2))
|
||
|
|
return p1, p2
|
||
|
|
|
||
|
|
|
||
|
|
def _rotate(m):
|
||
|
|
return [list(l) for l in zip(*m[::-1])]
|
||
|
|
|
||
|
|
|
||
|
|
def _tilt(m):
|
||
|
|
m = [list(l) for l in zip(*m)]
|
||
|
|
h = len(m[0])
|
||
|
|
for c in m:
|
||
|
|
u = True
|
||
|
|
while u:
|
||
|
|
u = False
|
||
|
|
for i in range(h - 1):
|
||
|
|
j = i + 1
|
||
|
|
if c[i] == "#" or c[j] == "#":
|
||
|
|
continue
|
||
|
|
if c[i] < c[j]:
|
||
|
|
c[j], c[i] = c[i], c[j]
|
||
|
|
u = True
|
||
|
|
return [list(l) for l in zip(*m)]
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
with open("./input/14.txt", "r") as f:
|
||
|
|
inp = f.read().strip()
|
||
|
|
|
||
|
|
inp = presolve(inp)
|
||
|
|
|
||
|
|
a = part_1(inp)
|
||
|
|
b = part_2(inp)
|
||
|
|
|
||
|
|
assert a == 109596
|
||
|
|
assert b == 96105
|