Skip to content

Commit 7b6b718

Browse files
committed
AoC 2024 Day 19 - fixed
1 parent 8365a4d commit 7b6b718

File tree

2 files changed

+18
-48
lines changed

2 files changed

+18
-48
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
## 2024
44

5-
![](https://img.shields.io/badge/stars%20⭐-36-yellow)
6-
![](https://img.shields.io/badge/days%20completed-18-red)
5+
![](https://img.shields.io/badge/stars%20⭐-38-yellow)
6+
![](https://img.shields.io/badge/days%20completed-19-red)
77

88
<!-- @BEGIN:ImplementationsTable:2024@ -->
99
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
1010
| ---| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
11-
| python3 | [](src/main/python/AoC2024_01.py) | [](src/main/python/AoC2024_02.py) | [](src/main/python/AoC2024_03.py) | [](src/main/python/AoC2024_04.py) | [](src/main/python/AoC2024_05.py) | [](src/main/python/AoC2024_06.py) | [](src/main/python/AoC2024_07.py) | [](src/main/python/AoC2024_08.py) | [](src/main/python/AoC2024_09.py) | [](src/main/python/AoC2024_10.py) | [](src/main/python/AoC2024_11.py) | [](src/main/python/AoC2024_12.py) | [](src/main/python/AoC2024_13.py) | [](src/main/python/AoC2024_14.py) | [](src/main/python/AoC2024_15.py) | [](src/main/python/AoC2024_16.py) | [](src/main/python/AoC2024_17.py) | [](src/main/python/AoC2024_18.py) | | | | | | | |
11+
| python3 | [](src/main/python/AoC2024_01.py) | [](src/main/python/AoC2024_02.py) | [](src/main/python/AoC2024_03.py) | [](src/main/python/AoC2024_04.py) | [](src/main/python/AoC2024_05.py) | [](src/main/python/AoC2024_06.py) | [](src/main/python/AoC2024_07.py) | [](src/main/python/AoC2024_08.py) | [](src/main/python/AoC2024_09.py) | [](src/main/python/AoC2024_10.py) | [](src/main/python/AoC2024_11.py) | [](src/main/python/AoC2024_12.py) | [](src/main/python/AoC2024_13.py) | [](src/main/python/AoC2024_14.py) | [](src/main/python/AoC2024_15.py) | [](src/main/python/AoC2024_16.py) | [](src/main/python/AoC2024_17.py) | [](src/main/python/AoC2024_18.py) | [](src/main/python/AoC2024_19.py) | | | | | | |
1212
| java | [](src/main/java/AoC2024_01.java) | [](src/main/java/AoC2024_02.java) | [](src/main/java/AoC2024_03.java) | [](src/main/java/AoC2024_04.java) | [](src/main/java/AoC2024_05.java) | [](src/main/java/AoC2024_06.java) | [](src/main/java/AoC2024_07.java) | [](src/main/java/AoC2024_08.java) | | [](src/main/java/AoC2024_10.java) | [](src/main/java/AoC2024_11.java) | [](src/main/java/AoC2024_12.java) | | [](src/main/java/AoC2024_14.java) | [](src/main/java/AoC2024_15.java) | | | | | | | | | | |
1313
| rust | [](src/main/rust/AoC2024_01/src/main.rs) | [](src/main/rust/AoC2024_02/src/main.rs) | [](src/main/rust/AoC2024_03/src/main.rs) | [](src/main/rust/AoC2024_04/src/main.rs) | [](src/main/rust/AoC2024_05/src/main.rs) | [](src/main/rust/AoC2024_06/src/main.rs) | [](src/main/rust/AoC2024_07/src/main.rs) | [](src/main/rust/AoC2024_08/src/main.rs) | | [](src/main/rust/AoC2024_10/src/main.rs) | [](src/main/rust/AoC2024_11/src/main.rs) | | [](src/main/rust/AoC2024_13/src/main.rs) | [](src/main/rust/AoC2024_14/src/main.rs) | [](src/main/rust/AoC2024_15/src/main.rs) | [](src/main/rust/AoC2024_16/src/main.rs) | [](src/main/rust/AoC2024_17/src/main.rs) | [](src/main/rust/AoC2024_18/src/main.rs) | | | | | | | |
1414
<!-- @END:ImplementationsTable:2024@ -->

src/main/python/AoC2024_19.py

Lines changed: 15 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
#
55

66
import sys
7+
from functools import cache
78

89
from aoc.common import InputData
910
from aoc.common import SolutionBase
1011
from aoc.common import aoc_samples
11-
from aoc.common import log
1212

13-
Input = tuple[set[str], list[str]]
13+
Input = tuple[tuple[str, ...], list[str]]
1414
Output1 = int
1515
Output2 = int
1616

@@ -32,55 +32,25 @@
3232
class Solution(SolutionBase[Input, Output1, Output2]):
3333
def parse_input(self, input_data: InputData) -> Input:
3434
lines = list(input_data)
35-
return set(lines[0].split(", ")), lines[2:]
35+
return tuple(lines[0].split(", ")), lines[2:]
36+
37+
@cache
38+
def count(self, design: str, towels: tuple[str]) -> int:
39+
if len(design) == 0:
40+
return 1
41+
return sum(
42+
self.count(design[len(towel) :], towels) # noqa E203
43+
for towel in towels
44+
if design.startswith(towel)
45+
)
3646

3747
def part_1(self, input: Input) -> Output1:
3848
towels, designs = input
39-
possible = set[str](towels)
40-
41-
def find(w: str, pos: int) -> bool:
42-
if pos == len(w):
43-
return True
44-
pp = [p for p in possible if w[pos:].startswith(p)]
45-
for ppp in pp:
46-
possible.add(w[:pos + len(ppp)])
47-
return any(find(w, pos + len(ppp)) for ppp in pp)
48-
49-
ans = 0
50-
for design in designs:
51-
if find(design, 0):
52-
ans += 1
53-
return ans
49+
return sum(self.count(design, towels) > 0 for design in designs)
5450

5551
def part_2(self, input: Input) -> Output2:
5652
towels, designs = input
57-
possible = set[str](towels)
58-
59-
def find(w: str, pos: tuple[int], poss: set[tuple[str, ...]]) -> None:
60-
if sum(pos) == len(w):
61-
ii = 0
62-
lst = list[str]()
63-
for i in range(1, len(pos)):
64-
lst.append(w[ii:ii+pos[i]])
65-
ii += pos[i]
66-
if all(_ in towels for _ in lst):
67-
poss.add(tuple(_ for _ in lst))
68-
return
69-
pp = [p for p in possible if w[sum(pos):].startswith(p)]
70-
for ppp in pp:
71-
possible.add(w[:sum(pos) + len(ppp)])
72-
tmp = list(pos[:]) + [len(ppp)]
73-
new_pos = tuple(_ for _ in tmp)
74-
find(w, new_pos, poss)
75-
76-
ans = 0
77-
for design in designs:
78-
log(f"{design=}")
79-
poss = set[tuple[str, ...]]()
80-
find(design, (0, ), poss)
81-
log(f"{design=}: {len(poss)}: {poss}")
82-
ans += len(poss)
83-
return ans
53+
return sum(self.count(design, towels) for design in designs)
8454

8555
@aoc_samples(
8656
(

0 commit comments

Comments
 (0)