Day 21 - some fiddling around

This commit is contained in:
Stefan Harmuth 2024-01-09 08:46:38 +01:00
parent 83f612ce9a
commit 8910705d2e

View File

@ -1,7 +1,9 @@
import math
from collections import deque, defaultdict
from tools.aoc import AOCDay
from tools.coordinate import Coordinate
from tools.coordinate import Coordinate, Line
from tools.grid import Grid
from tools.visualization import Window
from typing import Any
@ -13,23 +15,23 @@ def walk(grid: Grid, start: Coordinate, steps: int) -> int:
v2 = set()
while q:
coord, dist = q.popleft()
#print("check ", coord, dist)
# print("check ", coord, dist)
if coord in v or coord in v2:
#print(" -> in v")
# print(" -> in v")
continue
if dist % 2 == s_mod:
#print(f" -> add to v because {dist} even or == {steps}")
# print(f" -> add to v because {dist} even or == {steps}")
v.add(coord)
else:
v2.add(coord)
if dist >= steps:
#print(f" -> >= {steps}")
# print(f" -> >= {steps}")
continue
for n in coord.getNeighbours(includeDiagonal=False):
if grid.get(n % (grid.maxX + 1)):
q.append((n, dist + 1))
#print([x for x in v])
# print([x for x in v])
return len(v)
@ -40,48 +42,50 @@ class Day(AOCDay):
(3562, "input21"),
],
[
#(16733044, "input21_test"),
# (16733044, "input21_test"),
(None, "input21"),
]
],
]
def parse_input(self) -> (Grid, Coordinate):
grid = Grid().from_data(self.getInput(), translate={'.': True, '#': False})
grid = Grid().from_data(self.getInput(), translate={".": True, "#": False})
start = None
for x in grid.getActiveCells():
if grid.get(x) == 'S':
start = x
grid.set(x, True)
for x in grid.find("S"):
start = x
grid.set(x, True)
break # there is only one S
return grid, start
def part1(self) -> Any:
needed_steps = 6 if 'test' in self._current_test_file else 64
needed_steps = 6 if self.is_test() else 64
grid, start = self.parse_input()
return walk(grid, start, needed_steps)
def part2(self) -> Any:
grid, start = self.parse_input()
needed_steps = 5000 if 'test' in self._current_test_file else 26501365
k = walk(grid, start, len(self.getInput()))
g = walk(grid, start, 2 * len(self.getInput()))
v = walk(grid, start, 3 * len(self.getInput()))
print(k, g, v, g-k, v-g)
return ""
j = 0
mem = defaultdict(list)
for i in range(1, 250, 2):
k = walk(grid, start, i)
diff = k - j
j = k
mem[diff].append(i)
print(i, "=>", k, "diff", diff, "mod", k % 81)
for k, v in mem.items():
if len(v) > 1:
print(k, "=>", v)
print(grid.getOnCount())
for i in [Coordinate(0, 65), Coordinate(65, 0), Coordinate(130, 65), Coordinate(65, 130)]:
t = walk(grid, i, 131) # this always yields 14746 ... coincidence?
print(f"{i} = {t}")
for i in [Coordinate(0, 0), Coordinate(130, 0), Coordinate(0, 130), Coordinate(130, 130)]:
t = walk(grid, i, 65)
print(f"{i} = {t}")
needed_steps = 5000 if self.is_test() else 26501365
t = walk(grid, start, 64)
k = walk(grid, start, len(self.getInput()) + 65)
g = walk(grid, start, 2 * len(self.getInput()) + 65)
# v = walk(grid, start, (3 * len(self.getInput())) - 1)
print(f"65={t}, 196={k}, 327={g}, {math.log(k)=}, {math.log(g)=}")
print(((k - t) / 14746) * 3)
print((g - t) / 14746)
print((g - k) / 14746)
print(g % k)
print(k / t)
return ""
if __name__ == '__main__':
if __name__ == "__main__":
day = Day(2023, 21)
day.run(verbose=True)