Advertisement
Guest User

Untitled

a guest
Dec 15th, 2020
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.04 KB | None | 0 0
  1. import time
  2. import numpy as np
  3. from numba import njit, uint32
  4.  
  5.  
  6. @njit(uint32(uint32, uint32[:], uint32, uint32))
  7. def play_till_round(max_round, memory, last_number, n_starting_numbers):
  8.     for round_nr in range(n_starting_numbers + 1, max_round + 1):
  9.         next_number = (
  10.             round_nr - 1 - from_memory if (from_memory := memory[last_number]) else 0
  11.         )
  12.         memory[last_number] = round_nr - 1
  13.         last_number = next_number
  14.     return next_number
  15.  
  16.  
  17. def initial_memory(numbers, max_round):
  18.     memory = np.zeros(max_round, dtype=np.uint32)
  19.     for i, n in enumerate(numbers[:-1]):
  20.         memory[n] = i + 1
  21.     return memory
  22.  
  23.  
  24. with open("input.txt") as f:
  25.     init_numbers = list(map(int, f.read().strip().split(",")))
  26.  
  27. t0 = time.time()
  28. for part, n in ((1, 2020), (2, 30_000_000)):
  29.     print(
  30.         f"Part {part}:",
  31.         play_till_round(
  32.             n, initial_memory(init_numbers, n), init_numbers[-1], len(init_numbers)
  33.         ),
  34.     )
  35. print(f"Total time: {round(time.time() - t0, 2)} seconds")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement