Day 19

# puzzle prompt: https://adventofcode.com/2024/day/19

import sys
import time

sys.path.insert(0, "..")

from itertools import product

from base.advent import *


class Solution(InputAsBlockSolution):
    _year = 2024
    _day = 19

    _is_debugging = False

    def DesignTowels(self, input):
        patterns, designs = input[0][0], input[1]
        patterns = patterns.split(", ")

        towels = [self.FindArrangements(design, patterns) for design in designs]

        return sum(map(bool, towels)), sum(towels)

    def FindArrangements(self, design, patterns):
        candidate = [1] + [0] * len(design)

        positions = [
            (i, pattern)
            for i, pattern in product(range(len(design)), patterns)
            if design[i:].startswith(pattern)
        ]

        for i, pattern in positions:
            candidate[i + len(pattern)] += candidate[i]

        return candidate[-1]

    def pt1(self, input):
        self.debug(input)

        res, _ = self.DesignTowels(input)

        return res

    def pt2(self, input):
        self.debug(input)

        _, res = self.DesignTowels(input)

        return res

    def part_1(self):
        start_time = time.time()

        res = self.pt1(self.input)

        end_time = time.time()

        self.solve("1", res, (end_time - start_time))

    def part_2(self):
        start_time = time.time()

        res = self.pt2(self.input)

        end_time = time.time()

        self.solve("2", res, (end_time - start_time))


if __name__ == "__main__":
    solution = Solution()

    solution.part_1()

    solution.part_2()