Advertisement
hhoppe

Advent of code 2024 day 22 numba-jit 370 ms

Dec 22nd, 2024 (edited)
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.07 KB | None | 0 0
  1. @numba.njit
  2. def day22_jit(values, part2):
  3.   part1_total = 0
  4.   scores = {}  # Unfortunately, numba does not support defaultdict(int).
  5.   secrets = np.full(2001, 0)
  6.  
  7.   for value in values:
  8.     for i in range(2001):
  9.       secrets[i] = value
  10.       value = ((value << 6) ^ value) & 0xFFFFFF
  11.       value = ((value >> 5) ^ value) & 0xFFFFFF
  12.       value = ((value << 11) ^ value) & 0xFFFFFF
  13.  
  14.     if not part2:
  15.       part1_total += secrets[-1]
  16.       continue
  17.  
  18.     seen = set()
  19.     a = secrets[1] % 10 - secrets[0] % 10
  20.     b = secrets[2] % 10 - secrets[1] % 10
  21.     c = secrets[3] % 10 - secrets[2] % 10
  22.     for i in range(2000 - 3):
  23.       d = secrets[i + 4] % 10 - secrets[i + 3] % 10
  24.       seq = a, b, c, d
  25.       if seq not in seen:
  26.         seen.add(seq)
  27.         if seq in scores:
  28.           scores[seq] += secrets[i + 4] % 10
  29.         else:
  30.           scores[seq] = secrets[i + 4] % 10
  31.       a, b, c = b, c, d
  32.  
  33.   return max(scores.values()) if part2 else part1_total
  34.  
  35.  
  36. def day22(s, *, part2=False):
  37.   values = list(map(int, s.splitlines()))
  38.   return day22_jit(values, part2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement