From d4aad95f559286f3f2913187a17b18cb4f902220 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Thu, 19 Dec 2024 09:05:55 +0100 Subject: [PATCH] Implement 2024 day 19 --- 2024/src/aoc/days/day19.py | 37 +++++++++++++++++++++++++++++++++++++ 2024/tests/samples/19.txt | 10 ++++++++++ 2024/tests/test_day19.py | 11 +++++++++++ 3 files changed, 58 insertions(+) create mode 100644 2024/src/aoc/days/day19.py create mode 100644 2024/tests/samples/19.txt create mode 100644 2024/tests/test_day19.py diff --git a/2024/src/aoc/days/day19.py b/2024/src/aoc/days/day19.py new file mode 100644 index 0000000..b2e9f06 --- /dev/null +++ b/2024/src/aoc/days/day19.py @@ -0,0 +1,37 @@ +import functools + +from . import CombinedRunner + + +def parse_input(data: str) -> tuple[tuple[str, ...], list[str]]: + patterns, designs = data.strip().split("\n\n") + + return tuple(patterns.split(", ")), designs.split("\n") + + +@functools.cache +def is_possible(design: str, patterns: tuple[str, ...]) -> bool: + if not design: + return 1 + + return sum( + is_possible(design[len(pat) :], patterns) + for pat in patterns + if design.startswith(pat) + ) + + +class DayRunner(CombinedRunner): + @classmethod + def run_both(cls, input: str) -> int: + patterns, designs = parse_input(input) + + possible = 0 + ways = 0 + + for design in designs: + if (solve := is_possible(design, patterns)) > 0: + possible += 1 + ways += solve + + return possible, ways diff --git a/2024/tests/samples/19.txt b/2024/tests/samples/19.txt new file mode 100644 index 0000000..29648be --- /dev/null +++ b/2024/tests/samples/19.txt @@ -0,0 +1,10 @@ +r, wr, b, g, bwu, rb, gb, br + +brwrr +bggr +gbbr +rrbgbr +ubwu +bwurrg +brgr +bbrgwb diff --git a/2024/tests/test_day19.py b/2024/tests/test_day19.py new file mode 100644 index 0000000..981528b --- /dev/null +++ b/2024/tests/test_day19.py @@ -0,0 +1,11 @@ +from aoc.days.day19 import DayRunner + +from . import get_data + + +def test_sample_part1() -> None: + assert DayRunner.part1(get_data(19)) == 6 + + +def test_sample_part2() -> None: + assert DayRunner.part2(get_data(19)) == 16