Day 11

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

import sys
import time

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

from collections import Counter

from base.advent import *


class Solution(InputAsStringSolution):
    _year = 2024
    _day = 11

    _is_debugging = False

    def Blink(self, input):
        res = []
        stones = Counter([int(val) for val in input.split()])

        for i in range(75):
            for val, occurrences in list(stones.items()):
                if val == 0:  # when 0 then 1
                    stones[1] += occurrences
                elif len(value := str(val)) % 2 == 0:  # when len is even, split
                    stones[int(value[: len(value) // 2])] += occurrences
                    stones[int(value[len(value) // 2 :])] += occurrences
                else:
                    stones[val * 2024] += occurrences  # fallback, mul by 2024

                stones[val] -= occurrences

            if i in (24, 74):  # magic numbers from the puzzle
                res.append(sum(stones.values()))

        return res

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

        res = self.Blink(input)[0]

        return res

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

        res = self.Blink(input)[1]

        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()