Skip to content

Commit 61ea803

Browse files
committed
[2024/19] p2 solved
1 parent d981f9d commit 61ea803

File tree

3 files changed

+20
-20
lines changed

3 files changed

+20
-20
lines changed

.aoc_tiles/tiles/2024/19.png

43 Bytes
Loading

2024/19/script.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,16 @@
33

44

55
@cache
6-
def validate(design: str, patterns: frozenset[str]) -> bool:
7-
if design in patterns:
8-
return True
9-
else:
10-
# try all splits
11-
valid = False
12-
for i in range(1, len(design)):
13-
if aoc.args.verbose:
14-
print(f" trying {design[:i]}-{design[i:]}")
15-
valid = validate(design[:i], patterns) and validate(design[i:], patterns)
16-
if valid:
17-
return True
18-
19-
return False
6+
def validate(design: str, patterns: frozenset[str]) -> int:
7+
# if there's nothing left of the design after recursively slicing patterns from it,
8+
# we found a valid arrangement. return 1 to count it in our sum of all arrangements
9+
if not design:
10+
return 1
11+
12+
# try removing all patterns from the start of the design,
13+
# then recursively do that for each remaining segment of the design
14+
return sum(validate(design[len(pattern):], patterns)
15+
for pattern in patterns if design[:len(pattern)] == pattern)
2016

2117

2218
def main():
@@ -25,19 +21,23 @@ def main():
2521
designs = designs.splitlines()
2622

2723
valid = 0
24+
total_arrangements = 0
2825
for design in designs:
29-
if validate(design, patterns):
26+
arrangements = validate(design, patterns)
27+
if arrangements:
3028
if aoc.args.verbose or aoc.args.progress:
31-
print(f"1 - {design}")
29+
print(f"1 - {design} - {arrangements}")
3230
valid += 1
31+
total_arrangements += arrangements
3332
else:
3433
if aoc.args.verbose or aoc.args.progress:
3534
print(f"0 - {design}")
3635

37-
if aoc.args.progress:
38-
print(f"cache: {validate.cache_info().hits} hits, {validate.cache_info().misses} misses")
36+
if aoc.args.verbose or aoc.args.progress:
37+
print(f"validate() {validate.cache_info()}")
3938

4039
print(f"p1: {valid}")
40+
print(f"p2: {total_arrangements}")
4141

4242

4343
if __name__ == "__main__":

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ My solutions to the yearly Advents of Code
33

44
<!-- AOC TILES BEGIN -->
55
<h1 align="center">
6-
Advent of Code - 196/488 ⭐
6+
Advent of Code - 197/488 ⭐
77
</h1>
88
<h1 align="center">
9-
2024 - 35 ⭐ - Python
9+
2024 - 36 ⭐ - Python
1010
</h1>
1111
<a href="2024/1/script.py">
1212
<img src=".aoc_tiles/tiles/2024/01.png" width="161px">

0 commit comments

Comments
 (0)