Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """Day 15 of Advent of Code 2020 Solution"""
- from collections import defaultdict, deque
- class RambunctiousRecitation:
- def __init__(self, starting_numbers: str):
- self.starting_numbers: deque[int] = deque(
- [int(n) for n in starting_numbers.split(",")]
- )
- self.current_turn: int = 0
- self.last_seen: defaultdict[int, deque[int, int]] = defaultdict(
- lambda: deque([0, 0], maxlen=2)
- )
- self.last_spoken = None
- self.seen: set[int] = set()
- def __next__(self):
- self.current_turn += 1
- if self.starting_numbers:
- spoken = self.starting_numbers.popleft()
- self.last_seen[spoken].appendleft(self.current_turn)
- self.last_spoken = spoken
- return
- if self.last_seen[self.last_spoken][-1] == 0:
- self.last_spoken = 0
- self.last_seen[self.last_spoken].appendleft(self.current_turn)
- else:
- self.last_spoken = (
- self.last_seen[self.last_spoken][0]
- - self.last_seen[self.last_spoken][-1]
- )
- self.last_seen[self.last_spoken].appendleft(self.current_turn)
- def find_nth_number(starting_numbers: str, nth_number: int) -> int:
- rr = RambunctiousRecitation(starting_numbers)
- for _ in range(nth_number):
- next(rr)
- return rr.last_spoken
- def part_a(file_location):
- with open(file_location, "r") as f:
- data = f.readline().strip()
- return find_nth_number(data, 2020)
- def part_b(file_location):
- with open(file_location, "r") as f:
- data = f.readline().strip()
- return find_nth_number(data, 30000000)
- if __name__ == "__main__":
- file_location = r"data\day15.txt"
- print(part_a(file_location))
- print(part_b(file_location))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement