From 4c9ae83184eebb00316a62c063fd4d01b8679d09 Mon Sep 17 00:00:00 2001 From: Matthew Gretton-Dann Date: Thu, 19 Dec 2024 11:10:16 +0000 Subject: [PATCH] 2024 day 19 part 2. --- bin/day2419.ml | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/bin/day2419.ml b/bin/day2419.ml index c0ec9ab..f5b73fb 100644 --- a/bin/day2419.ml +++ b/bin/day2419.ml @@ -31,14 +31,35 @@ let rec memoize_has_pattern pattern towels = x let has_match towels pattern = memoize_has_pattern pattern towels +let memo2 = Hashtbl.create 1000 + +let rec memoize_count_matches pattern towels = + let pattern_len = String.length pattern in + let rec has_pattern = function + | [] -> 0 + | h :: t -> + let towel_len = String.length h in + if String.starts_with ~prefix:h pattern then + memoize_count_matches + (String.sub pattern towel_len (pattern_len - towel_len)) + towels + + has_pattern t + else has_pattern t + in + match Hashtbl.find_opt memo2 pattern with + | Some x -> x + | None -> + let x = if pattern_len = 0 then 1 else has_pattern towels in + Hashtbl.add memo2 pattern x; + x + +let count_matches towels pattern = memoize_count_matches pattern towels let part1 (towels, patterns) = - List.filter - (fun p -> - let x = has_match towels p in - flush stdout; - x) - patterns - |> List.length + List.filter (has_match towels) patterns |> List.length -let _ = Aoc.main towels_of_file [ (string_of_int, part1) ] +let part2 (towels, patterns) = + List.map (count_matches towels) patterns |> List.fold_left ( + ) 0 + +let _ = + Aoc.main towels_of_file [ (string_of_int, part1); (string_of_int, part2) ]