summaryrefslogtreecommitdiffstats
path: root/day2/__init__.py
blob: 20e573eaeaf8a7cdb7b452b58b58f9fa06bab2e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# -*- coding: utf-8 -*-
import re
from abc import ABC
from typing import Iterator

from aoc import BaseAssignment, I, T


class Assignment(BaseAssignment, ABC):
    @classmethod
    def parse_item(cls, item: str) -> Iterator[range]:
        for r in item.split(","):
            [start, end] = r.split("-")
            yield range(int(start), int(end) + 1)

    def find_invalid_ids(self, item: range) -> Iterator[int]:
        raise NotImplementedError()

    def run(self, input: Iterator[range]) -> int:
        totals = 0
        for item in input:
            totals += sum(self.find_invalid_ids(item))

        return totals


class AssignmentOne(Assignment):
    example_result = 1227775554

    @classmethod
    def find_invalid_ids(cls, item: range):
        for i in item:
            i_str = str(i)
            if i_str[: len(i_str) // 2] == i_str[len(i_str) // 2 :]:
                yield i


class AssignmentTwo(Assignment):
    example_result = 4174379265

    @classmethod
    def is_invalid_id(cls, item: str) -> bool:
        for i in range(1, (len(item) // 2) + 1):
            pattern = item[:i]
            rest = item[i:]

            if re.match(rf"({pattern})+$", rest):
                return True

        return False

    @classmethod
    def find_invalid_ids(cls, item: range):
        for i in item:
            i_str = str(i)

            if AssignmentTwo.is_invalid_id(i_str):
                yield i