day 16.1 down to 1.5 seconds !!
This commit is contained in:
parent
5c0d7867a4
commit
2a515a5323
16
src/day16.ml
16
src/day16.ml
|
|
@ -136,16 +136,20 @@ let%expect_test "Day 16.1" =
|
|||
[%expect {| 2265 |}]
|
||||
;;
|
||||
|
||||
(* still takes 10 seconds >:( *)
|
||||
(* down to 1.5 seconds! bitmasks ???? *)
|
||||
let%expect_test "Day 16.2" =
|
||||
let valves, get_dist = parse_valves @@ Utils.lines_of_input 16 in
|
||||
let states = traverse get_dist valves "AA" 26 0 StrSet.empty in
|
||||
let states =
|
||||
traverse get_dist valves "AA" 26 0 StrSet.empty
|
||||
|> Iter.of_hashtbl
|
||||
|> Iter.sort ~cmp:(fun (_, a_score) (_, b_score) -> b_score - a_score)
|
||||
in
|
||||
let best =
|
||||
states
|
||||
|> Iter.of_hashtbl
|
||||
|> Iter.diagonal
|
||||
|> Iter.filter_map (fun ((a_set, a_score), (b_set, b_score)) ->
|
||||
if StrSet.disjoint a_set b_set then Some (a_score + b_score) else None)
|
||||
|> Iter.filter_map (fun (a_set, a_score) ->
|
||||
match Iter.find_pred (fun (b_set, _) -> StrSet.disjoint a_set b_set) states with
|
||||
| Some (_, b_score) -> Some (a_score + b_score)
|
||||
| None -> None)
|
||||
|> Iter.fold Int.max 0
|
||||
in
|
||||
Printf.printf "%i\n" @@ best;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user