3 Commits

Author SHA1 Message Date
329cd4e471 More optimizations 2024-12-22 14:11:39 +01:00
321d78d850 More loops to numpy 2024-12-22 12:15:11 +01:00
230b4ae028 Implement 2024 day 22 2024-12-22 12:03:44 +01:00
4 changed files with 60 additions and 0 deletions

View File

@@ -0,0 +1,41 @@
from collections import defaultdict
import numpy
from numpy.lib.stride_tricks import sliding_window_view
from . import CombinedRunner
def advance(secrets: numpy.array) -> numpy.array:
new_secrets = (secrets ^ (secrets << 6)) & 0xFFFFFF
new_secrets ^= new_secrets >> 5
new_secrets ^= new_secrets << 11
new_secrets &= 0xFFFFFF
return new_secrets
class DayRunner(CombinedRunner):
@classmethod
def run_both(cls, input: str) -> tuple[int, int]:
secrets = numpy.fromstring(input, dtype=int, sep="\n")
progression = [secrets]
for _ in range(2000):
secrets = advance(secrets)
progression.append(secrets)
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, windows):
unique, positions = numpy.unique(row_deltas, return_index=True, axis=0)
for key, bananas in zip(unique, row_scores[positions + 4]):
per_signal[tuple(key)] += bananas
return secrets.sum(), max(per_signal.values())

View File

@@ -0,0 +1,4 @@
1
10
100
2024

View File

@@ -0,0 +1,4 @@
1
2
3
2024

11
2024/tests/test_day22.py Normal file
View File

@@ -0,0 +1,11 @@
from aoc.days.day22 import DayRunner
from . import get_data
def test_sample_part1() -> None:
assert DayRunner.part1(get_data(22, 1)) == 37327623
def test_sample_part2() -> None:
assert DayRunner.part2(get_data(22, 2)) == 23