mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 12:50:32 +01:00
Compare commits
3 Commits
be2244eca9
...
329cd4e471
| Author | SHA1 | Date | |
|---|---|---|---|
| 329cd4e471 | |||
| 321d78d850 | |||
| 230b4ae028 |
41
2024/src/aoc/days/day22.py
Normal file
41
2024/src/aoc/days/day22.py
Normal 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())
|
||||
4
2024/tests/samples/22.1.txt
Normal file
4
2024/tests/samples/22.1.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
1
|
||||
10
|
||||
100
|
||||
2024
|
||||
4
2024/tests/samples/22.2.txt
Normal file
4
2024/tests/samples/22.2.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
1
|
||||
2
|
||||
3
|
||||
2024
|
||||
11
2024/tests/test_day22.py
Normal file
11
2024/tests/test_day22.py
Normal 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
|
||||
Reference in New Issue
Block a user