From 329cd4e4715eb47906719ad55888ff421709d98c Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sun, 22 Dec 2024 14:11:39 +0100 Subject: [PATCH] More optimizations --- 2024/src/aoc/days/day22.py | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/2024/src/aoc/days/day22.py b/2024/src/aoc/days/day22.py index a0dfcb8..0ca16bc 100644 --- a/2024/src/aoc/days/day22.py +++ b/2024/src/aoc/days/day22.py @@ -3,7 +3,7 @@ from collections import defaultdict import numpy from numpy.lib.stride_tricks import sliding_window_view -from . import SeparateRunner +from . import CombinedRunner def advance(secrets: numpy.array) -> numpy.array: @@ -15,18 +15,9 @@ def advance(secrets: numpy.array) -> numpy.array: return new_secrets -class DayRunner(SeparateRunner): +class DayRunner(CombinedRunner): @classmethod - def part1(cls, input: str) -> int: - secrets = numpy.fromstring(input, dtype=int, sep="\n") - - for _ in range(2000): - secrets = advance(secrets) - - return secrets.sum() - - @classmethod - def part2(cls, input: str) -> int: + def run_both(cls, input: str) -> tuple[int, int]: secrets = numpy.fromstring(input, dtype=int, sep="\n") progression = [secrets] @@ -37,15 +28,14 @@ class DayRunner(SeparateRunner): field = numpy.stack(progression, axis=-1) % 10 delta = field[:, 1:] - field[:, :-1] + windows = sliding_window_view(delta, 4, axis=1) per_signal = defaultdict(int) - for row_scores, row_deltas in zip(field, delta): - unique, positions = numpy.unique( - sliding_window_view(row_deltas, 4), return_index=True, axis=0 - ) + for row_scores, row_deltas in zip(field, windows): + unique, positions = numpy.unique(row_deltas, return_index=True, axis=0) - for key, index in zip(unique, positions): - per_signal[tuple(key)] += row_scores[index + 4] + for key, bananas in zip(unique, row_scores[positions + 4]): + per_signal[tuple(key)] += bananas - return max(per_signal.values()) + return secrets.sum(), max(per_signal.values())