# -*- coding: utf-8 -*- from abc import ABC from typing import Iterator from aoc import BaseAssignment, I class Assignment(BaseAssignment, ABC): def parse_item(self, item: str) -> Iterator[I]: [rotation, *places] = item places = int("".join(places)) yield -places if rotation == "L" else places class AssignmentOne(Assignment): example_result = 3 def run(self, input: Iterator[int]) -> int: seen_0 = 0 position = 50 for rotation in input: position = (position + rotation) % 100 if position == 0: seen_0 += 1 return seen_0 class AssignmentTwo(Assignment): example_result = 6 @staticmethod def calculate_new_position(position, rotation) -> tuple[int, int]: previous_position = position new_position = position + rotation overturned = new_position >= 100 or new_position < 0 multiplier = position - (0 - -previous_position) // 100 if overturned: new_position = new_position % 100 seen_0 = 0 if new_position == 0 and multiplier == 0: seen_0 += multiplier + 1 elif overturned: seen_0 += multiplier return new_position, seen_0 def run(self, input: Iterator[int]) -> int: seen_0_total = 0 position = 50 for rotation in input: position, seen_0 = self.calculate_new_position(position, rotation) seen_0_total += seen_0 return seen_0_total