From f315ef05c548da80410cb4f6665a9bba7a953f94 Mon Sep 17 00:00:00 2001 From: Tom van der Lee Date: Tue, 2 Dec 2025 07:57:38 +0100 Subject: Day 1 and 2 --- day1/__init__.py | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 day1/__init__.py (limited to 'day1/__init__.py') diff --git a/day1/__init__.py b/day1/__init__.py new file mode 100644 index 0000000..6e95329 --- /dev/null +++ b/day1/__init__.py @@ -0,0 +1,60 @@ +# -*- 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 -- cgit v1.2.3