Move memoize to the Aoc library.

This commit is contained in:
2024-12-19 11:53:59 +00:00
parent 4f963e0f98
commit aaa031e6c6
3 changed files with 17 additions and 15 deletions

View File

@@ -14,17 +14,6 @@ let towels_of_file fname = Aoc.strings_of_file fname |> towels_of_strings
(** Memoizing hash table shared between parts 1 and 2. *)
let memo = Hashtbl.create 1000
(** [memoize memo f value] returns the result of [f value]. The hashtable [memo]
is used to cache results, so repeated calls with the same [value] will not
call [f] again. *)
let memoize memo f value =
match Hashtbl.find_opt memo value with
| Some x -> x
| None ->
let x = f value in
Hashtbl.add memo value x;
x
(** [count_hashes memo towels pattern] counts the number of ways of matching
[pattern] using [towels]. [memo] is a hashtable used for memoizing results.
*)
@@ -35,7 +24,7 @@ let rec count_matches memo towels pattern =
| h :: t ->
let towel_len = String.length h in
if String.starts_with ~prefix:h pattern then
memoize memo
Aoc.memoize memo
(count_matches memo towels)
(String.sub pattern towel_len (pattern_len - towel_len))
+ count_matched t
@@ -44,12 +33,12 @@ let rec count_matches memo towels pattern =
if pattern_len = 0 then 1 else count_matched towels
let part1 (towels, patterns) =
List.map (count_matches memo towels) patterns
|> List.filter (( > ) 0)
List.map (Aoc.memoize memo (count_matches memo towels)) patterns
|> List.filter (( < ) 0)
|> List.length
let part2 (towels, patterns) =
List.map (memoize memo (count_matches memo towels)) patterns
List.map (Aoc.memoize memo (count_matches memo towels)) patterns
|> List.fold_left ( + ) 0
let _ =