DEV Community

Cover image for Advent of Code 2023 - December 12th
Rob van der Leek
Rob van der Leek

Posted on • Edited on

Advent of Code 2023 - December 12th

In this series, I'll share my progress with the 2023 version of Advent of Code.

Check the first post for a short intro to this series.

You can also follow my progress on GitHub.

December 12th

The puzzle of day 12 is again a breeze for part one, and a real hair-puller for part two.

My pitfall for this puzzle: Stuck on part two. Obviously, the implementation of part one is not going to cut it. I'll try to get back to this puzzle at a later time.
UPDATE: I finally managed this finish the second part. Considering how straightforward the code is, I can't believe this took me so long. Full disclosure: I consulted Reddit for some guidance because I wandered off in the wrong direction myself.

Solution here, do not click if you want to solve the puzzle first yourself
#!/usr/bin/env python3
import re
from functools import cache

rows = []

with open('input-small.txt') as infile:
    lines = infile.readlines()
    for line in lines:
        parts = line.strip().split(' ')
        springs = parts[0]
        groups = [int(g) for g in parts[1].split(',')]
        rows.append((springs, groups))

def generate(s):
    result = []
    if '?' not in s:
        result.append(s)
    else:
        result.extend(generate(s.replace('?', '#', 1)))
        result.extend(generate(s.replace('?', '.', 1)))
    return result

def is_valid(springs, groups):
    spring_groups = [len(p) for p in re.split('[.]+', springs) if p != '']
    g = list(groups)
    return spring_groups == g

@cache
def check(s, groups):
    if len(groups) == 0:
        if '#' not in s:
            return 1
        else:
            return 0
    s = s.strip('.')
    dot_index = s.find('.')
    question_index = s.find('?')
    if question_index >= 0 and (question_index < dot_index or dot_index < 0):
        return \
            check(s.replace('?', '#', 1), groups) + \
            check(s.replace('?', '.', 1), groups)
    else:
        if dot_index < 0 and len(s) == groups[0]:
            return check('', groups[1:])
        elif dot_index == groups[0]:
            return check(s[dot_index:], groups[1:])
        else:
            return 0

total = 0
for r in rows:
    springs = ''
    groups = []
    for i in range(5):
        springs += r[0]
        springs += '?' if i < 4 else ''
        groups.extend(r[1])
    valid = check(springs, tuple(groups))
    total += valid

print(total)
Enter fullscreen mode Exit fullscreen mode

That's it! See you again tomorrow!

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up