2024 day 23 part 2
This commit is contained in:
@@ -2,12 +2,8 @@ module StringMap = Map.Make (String)
|
|||||||
module StringSet = Set.Make (String)
|
module StringSet = Set.Make (String)
|
||||||
|
|
||||||
let[@warning "-32"] print_set set =
|
let[@warning "-32"] print_set set =
|
||||||
StringSet.iter
|
StringSet.to_list set |> List.sort compare |> String.concat ","
|
||||||
(fun x ->
|
|> Printf.printf "%s\n"
|
||||||
print_string x;
|
|
||||||
print_char ' ')
|
|
||||||
set;
|
|
||||||
print_newline ()
|
|
||||||
|
|
||||||
let[@warning "-32"] print_sets = List.iter print_set
|
let[@warning "-32"] print_sets = List.iter print_set
|
||||||
|
|
||||||
@@ -88,4 +84,35 @@ let part1 connections =
|
|||||||
print_sets rings;
|
print_sets rings;
|
||||||
List.length 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