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!

Top comments (0)

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay