2024 day 23 part 2
This commit is contained in:
@@ -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) ]
|
||||
|
Reference in New Issue
Block a user