From 8910705d2e9686b0572243e8b19455996f302532 Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Tue, 9 Jan 2024 08:46:38 +0100 Subject: [PATCH] Day 21 - some fiddling around --- day21.py | 68 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/day21.py b/day21.py index 28f1671..24347ac 100644 --- a/day21.py +++ b/day21.py @@ -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)