mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
More optimizations
This commit is contained in:
@@ -3,7 +3,7 @@ from collections import defaultdict
|
|||||||
import numpy
|
import numpy
|
||||||
from numpy.lib.stride_tricks import sliding_window_view
|
from numpy.lib.stride_tricks import sliding_window_view
|
||||||
|
|
||||||
from . import SeparateRunner
|
from . import CombinedRunner
|
||||||
|
|
||||||
|
|
||||||
def advance(secrets: numpy.array) -> numpy.array:
|
def advance(secrets: numpy.array) -> numpy.array:
|
||||||
@@ -15,18 +15,9 @@ def advance(secrets: numpy.array) -> numpy.array:
|
|||||||
return new_secrets
|
return new_secrets
|
||||||
|
|
||||||
|
|
||||||
class DayRunner(SeparateRunner):
|
class DayRunner(CombinedRunner):
|
||||||
@classmethod
|
@classmethod
|
||||||
def part1(cls, input: str) -> int:
|
def run_both(cls, input: str) -> tuple[int, 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:
|
|
||||||
secrets = numpy.fromstring(input, dtype=int, sep="\n")
|
secrets = numpy.fromstring(input, dtype=int, sep="\n")
|
||||||
|
|
||||||
progression = [secrets]
|
progression = [secrets]
|
||||||
@@ -37,15 +28,14 @@ class DayRunner(SeparateRunner):
|
|||||||
|
|
||||||
field = numpy.stack(progression, axis=-1) % 10
|
field = numpy.stack(progression, axis=-1) % 10
|
||||||
delta = field[:, 1:] - field[:, :-1]
|
delta = field[:, 1:] - field[:, :-1]
|
||||||
|
windows = sliding_window_view(delta, 4, axis=1)
|
||||||
|
|
||||||
per_signal = defaultdict(int)
|
per_signal = defaultdict(int)
|
||||||
|
|
||||||
for row_scores, row_deltas in zip(field, delta):
|
for row_scores, row_deltas in zip(field, windows):
|
||||||
unique, positions = numpy.unique(
|
unique, positions = numpy.unique(row_deltas, return_index=True, axis=0)
|
||||||
sliding_window_view(row_deltas, 4), return_index=True, axis=0
|
|
||||||
)
|
|
||||||
|
|
||||||
for key, index in zip(unique, positions):
|
for key, bananas in zip(unique, row_scores[positions + 4]):
|
||||||
per_signal[tuple(key)] += row_scores[index + 4]
|
per_signal[tuple(key)] += bananas
|
||||||
|
|
||||||
return max(per_signal.values())
|
return secrets.sum(), max(per_signal.values())
|
||||||
|
|||||||
Reference in New Issue
Block a user