diff options
| author | 2025-12-02 07:57:38 +0100 | |
|---|---|---|
| committer | 2025-12-02 09:40:04 +0100 | |
| commit | f315ef05c548da80410cb4f6665a9bba7a953f94 (patch) | |
| tree | a727c6ad862a4a9c237c320705483b3def7acc11 /day2/__init__.py | |
| parent | d7e30321ae6ae4c82a8ab7455f6ce33afd719c67 (diff) | |
| download | 2025-f315ef05c548da80410cb4f6665a9bba7a953f94.tar.gz 2025-f315ef05c548da80410cb4f6665a9bba7a953f94.tar.bz2 2025-f315ef05c548da80410cb4f6665a9bba7a953f94.zip | |
Day 1 and 2
Diffstat (limited to 'day2/__init__.py')
| -rw-r--r-- | day2/__init__.py | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/day2/__init__.py b/day2/__init__.py new file mode 100644 index 0000000..882bcad --- /dev/null +++ b/day2/__init__.py | |||
| @@ -0,0 +1,57 @@ | |||
| 1 | # -*- coding: utf-8 -*- | ||
| 2 | import re | ||
| 3 | from abc import ABC | ||
| 4 | from typing import Iterator | ||
| 5 | |||
| 6 | from aoc import BaseAssignment, I, T | ||
| 7 | |||
| 8 | |||
| 9 | class Assignment(BaseAssignment, ABC): | ||
| 10 | def parse_item(self, item: str) -> Iterator[range]: | ||
| 11 | for r in item.split(","): | ||
| 12 | [start, end] = r.split("-") | ||
| 13 | yield range(int(start), int(end) + 1) | ||
| 14 | |||
| 15 | def find_invalid_ids(self, item: range) -> Iterator[int]: | ||
| 16 | raise NotImplementedError() | ||
| 17 | |||
| 18 | def run(self, input: Iterator[range]) -> int: | ||
| 19 | totals = 0 | ||
| 20 | for item in input: | ||
| 21 | totals += sum(self.find_invalid_ids(item)) | ||
| 22 | |||
| 23 | return totals | ||
| 24 | |||
| 25 | |||
| 26 | class AssignmentOne(Assignment): | ||
| 27 | example_result = 1227775554 | ||
| 28 | |||
| 29 | @classmethod | ||
| 30 | def find_invalid_ids(cls, item: range): | ||
| 31 | for i in item: | ||
| 32 | i_str = str(i) | ||
| 33 | if i_str[: len(i_str) // 2] == i_str[len(i_str) // 2 :]: | ||
| 34 | yield i | ||
| 35 | |||
| 36 | |||
| 37 | class AssignmentTwo(Assignment): | ||
| 38 | example_result = 4174379265 | ||
| 39 | |||
| 40 | @classmethod | ||
| 41 | def is_invalid_id(cls, item: str) -> bool: | ||
| 42 | for i in range(1, (len(item) // 2) + 1): | ||
| 43 | pattern = item[:i] | ||
| 44 | rest = item[i:] | ||
| 45 | |||
| 46 | if re.match(rf"({pattern})+$", rest): | ||
| 47 | return True | ||
| 48 | |||
| 49 | return False | ||
| 50 | |||
| 51 | @classmethod | ||
| 52 | def find_invalid_ids(cls, item: range): | ||
| 53 | for i in item: | ||
| 54 | i_str = str(i) | ||
| 55 | |||
| 56 | if AssignmentTwo.is_invalid_id(i_str): | ||
| 57 | yield i | ||
