diff --git a/bin/day2423.ml b/bin/day2423.ml index 5da8b59..36e11e8 100644 --- a/bin/day2423.ml +++ b/bin/day2423.ml @@ -2,12 +2,8 @@ module StringMap = Map.Make (String) module StringSet = Set.Make (String) let[@warning "-32"] print_set set = - StringSet.iter - (fun x -> - print_string x; - print_char ' ') - set; - print_newline () + StringSet.to_list set |> List.sort compare |> String.concat "," + |> Printf.printf "%s\n" let[@warning "-32"] print_sets = List.iter print_set @@ -88,4 +84,35 @@ let part1 connections = print_sets rings; List.length rings -let _ = Aoc.main load_file [ (string_of_int, part1) ] +let rec search_candidate max_set connections current candidates = + match StringSet.choose_opt candidates with + | None -> + if StringSet.cardinal current > StringSet.cardinal max_set then current + else max_set + | Some h -> + let current' = StringSet.add h current in + let candidates' = + StringSet.inter candidates (StringMap.find h connections) + in + let max_set = search_candidate max_set connections current' candidates' in + search_candidate max_set connections current + (StringSet.remove h candidates) + +let find_max_set connections = + let rec impl max_set = function + | [] -> max_set + | (k, v) :: t -> + impl + (search_candidate max_set connections + (StringSet.add k StringSet.empty) + v) + t + in + impl StringSet.empty (StringMap.to_list connections) + +let part2 connections = + let max_set = find_max_set connections in + print_set max_set; + StringSet.cardinal max_set + +let _ = Aoc.main load_file [ (string_of_int, part1); (string_of_int, part2) ]