@@ -2,11 +2,12 @@ package y2024
2
2
3
3
// see https://adventofcode.com/2024/day/19
4
4
class Day19 extends util.Day (19 ):
5
- def solvePart1 (input : IndexedSeq [String ]): Any =
5
+
6
+ def solvePart1 (input : IndexedSeq [String ]): Int =
6
7
val (patterns, designs) = parseInput(input)
7
- designs.count(design => canConstruct (design, patterns))
8
+ designs.count(design => countConstruct (design, patterns) > 0 )
8
9
9
- def solvePart2 (input : IndexedSeq [String ]): Any =
10
+ def solvePart2 (input : IndexedSeq [String ]): Long =
10
11
val (patterns, designs) = parseInput(input)
11
12
designs.map(design => countConstruct(design, patterns)).sum
12
13
@@ -18,23 +19,6 @@ class Day19 extends util.Day(19):
18
19
case _ =>
19
20
throw new IllegalArgumentException (" Invalid input format." )
20
21
21
- private def canConstruct (design : String , patterns : Set [String ]): Boolean =
22
- def recurse (index : Int , memo : Map [Int , Boolean ]): (Boolean , Map [Int , Boolean ]) =
23
- if index == design.length then (true , memo)
24
- else
25
- memo.get(index) match
26
- case Some (result) => (result, memo)
27
- case None =>
28
- val possible = patterns.exists: pattern =>
29
- val end = index + pattern.length
30
- end <= design.length &&
31
- design.startsWith(pattern, index) &&
32
- recurse(end, memo)._1
33
- (possible, memo + (index -> possible))
34
-
35
- recurse(0 , Map .empty)._1
36
- end canConstruct
37
-
38
22
private def countConstruct (design : String , patterns : Set [String ]): Long =
39
23
def recurse (index : Int , memo : Map [Int , Long ]): (Long , Map [Int , Long ]) =
40
24
if index == design.length then (1L , memo)
@@ -44,14 +28,13 @@ class Day19 extends util.Day(19):
44
28
case None =>
45
29
val (total, updatedMemo) = patterns.foldLeft((0L , memo)):
46
30
case ((acc, currentMemo), pattern) =>
47
- val end = index + pattern.length
48
- if end <= design.length && design.startsWith(pattern, index) then
49
- val (count, newMemo) = recurse(end, currentMemo)
50
- (acc + count, newMemo)
51
- else
52
- (acc, currentMemo)
31
+ val end = index + pattern.length
32
+ if end <= design.length && design.startsWith(pattern, index) then
33
+ val (count, newMemo) = recurse(end, currentMemo)
34
+ (acc + count, newMemo)
35
+ else
36
+ (acc, currentMemo)
53
37
(total, updatedMemo + (index -> total))
54
38
55
39
recurse(0 , Map .empty)._1
56
- end countConstruct
57
40
end Day19
0 commit comments