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