Solve 2024:19 p1-2 "Linen Layout"
Initial tries to use a while loop instead of
recursion gave a classic AoC situation: test cases
worked, but not actual AoC puzzle input.
Turns out I only considererd removing the longest
pattern form the design, rather than consider all
possible removals.
Some Python goodies in here:
- `"abcdefgh".startswith("abc")` instead of regexp.
- removeprefix() is nice, and in some cases more
readable. `"abcdefgh".removeprefix("abc")` vs
`"abcdefgh[3:]"
- To speed things up for pt 2, functools is used
which requires a dict to be hashed as a tuple.
If one wish to solve this without recursion, a
BFS solution is most likely the way to go.
def ispossible(design, patterns):
Q = [design]
possible = 0
while Q:
remaining = Q.pop(0)
if not remaining:
possible += 1
continue
for pattern in patterns[remaining[0]]:
if remaining.startswith(pattern):
Q.append(remaining.removeprefix(pattern))
return possible
This commit is contained in:
parent
9dc3f16766
commit
ded5c4f28c
1 changed files with 39 additions and 0 deletions
39
2024-python/output/day_19.py
Normal file
39
2024-python/output/day_19.py
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
from functools import cache
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
def solve(data):
|
||||
patterns, designs = data.split("\n\n")
|
||||
patterns = sorted(patterns.split(", "), key=lambda s: -len(s))
|
||||
designs = designs.split()
|
||||
|
||||
hashed = defaultdict(list)
|
||||
for p in patterns:
|
||||
hashed[p[0]].append(p)
|
||||
hashed = tuple([(k, tuple(v)) for k, v in hashed.items()])
|
||||
|
||||
possible = sum(ispossible(d, hashed) > 0 for d in designs)
|
||||
every_possibility = sum(ispossible(d, hashed) for d in designs)
|
||||
return possible, every_possibility
|
||||
|
||||
|
||||
@cache
|
||||
def ispossible(remaining, patterns):
|
||||
if not remaining:
|
||||
return 1
|
||||
selected = dict(patterns).get(remaining[0], [])
|
||||
return sum(
|
||||
ispossible(remaining.removeprefix(pattern), patterns)
|
||||
for pattern in selected
|
||||
if remaining.startswith(pattern)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
with open("./input/19.txt", "r") as f:
|
||||
inp = f.read().strip()
|
||||
|
||||
p1, p2 = solve(inp)
|
||||
|
||||
print(p1)
|
||||
print(p2)
|
||||
Loading…
Add table
Reference in a new issue