Skip to content

Commit

Permalink
Implement 2024 day 19
Browse files Browse the repository at this point in the history
  • Loading branch information
bertptrs committed Dec 19, 2024
1 parent caa2c9b commit d4aad95
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 0 deletions.
37 changes: 37 additions & 0 deletions 2024/src/aoc/days/day19.py
Original file line number Diff line number Diff line change
@@ -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
10 changes: 10 additions & 0 deletions 2024/tests/samples/19.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
r, wr, b, g, bwu, rb, gb, br

brwrr
bggr
gbbr
rrbgbr
ubwu
bwurrg
brgr
bbrgwb
11 changes: 11 additions & 0 deletions 2024/tests/test_day19.py
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit d4aad95

Please sign in to comment.