Day 12 - Advent of Code 2023

Working solutions for the day 12 puzzles.

Part One

""" day_12_01.py """

# usage: python3 day_12_01.py < input

import itertools
import re
import sys


answer = 0
for line in sys.stdin:
    template, recipe = line.split()
    recipe = list(map(int, recipe.split(',')))

    u, v = r'\.+', r'\.*'
    expr = re.compile(v + u.join([i * '#' for i in recipe]) + v)

    n = template.count('?')
    hashes = sum(recipe) - template.count('#')
    for p in itertools.filterfalse(lambda x: x.count('#') != hashes,
                                   itertools.product('.#', repeat=n)):
        q = list(p)
        item = ''.join([i if i != '?' else q.pop() for i in template])
        if expr.fullmatch(item):
            answer += 1

print(answer)

Part Two