2024 day 19 part 1
This commit is contained in:
44
bin/day2419.ml
Normal file
44
bin/day2419.ml
Normal file
@@ -0,0 +1,44 @@
|
||||
(** [towels_of_strings lst] returns a pair containing a list of available towels
|
||||
and a list of patterns wanted. *)
|
||||
let towels_of_strings = function
|
||||
| h :: "" :: t ->
|
||||
let re = Str.regexp "[, ]+" in
|
||||
let h = Str.split re h in
|
||||
(h, t)
|
||||
| _ -> failwith "towels_of_strings"
|
||||
|
||||
let towels_of_file fname = Aoc.strings_of_file fname |> towels_of_strings
|
||||
let memo = Hashtbl.create 1000
|
||||
|
||||
let rec memoize_has_pattern pattern towels =
|
||||
let pattern_len = String.length pattern in
|
||||
let rec has_pattern = function
|
||||
| [] -> false
|
||||
| h :: t ->
|
||||
let towel_len = String.length h in
|
||||
if String.starts_with ~prefix:h pattern then
|
||||
memoize_has_pattern
|
||||
(String.sub pattern towel_len (pattern_len - towel_len))
|
||||
towels
|
||||
|| has_pattern t
|
||||
else has_pattern t
|
||||
in
|
||||
match Hashtbl.find_opt memo pattern with
|
||||
| Some x -> x
|
||||
| None ->
|
||||
let x = if pattern_len = 0 then true else has_pattern towels in
|
||||
Hashtbl.add memo pattern x;
|
||||
x
|
||||
|
||||
let has_match towels pattern = memoize_has_pattern pattern towels
|
||||
|
||||
let part1 (towels, patterns) =
|
||||
List.filter
|
||||
(fun p ->
|
||||
let x = has_match towels p in
|
||||
flush stdout;
|
||||
x)
|
||||
patterns
|
||||
|> List.length
|
||||
|
||||
let _ = Aoc.main towels_of_file [ (string_of_int, part1) ]
|
Reference in New Issue
Block a user