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 |}]
|
[%expect {| 2265 |}]
|
||||||
;;
|
;;
|
||||||
|
|
||||||
(* still takes 10 seconds >:( *)
|
(* down to 1.5 seconds! bitmasks ???? *)
|
||||||
let%expect_test "Day 16.2" =
|
let%expect_test "Day 16.2" =
|
||||||
let valves, get_dist = parse_valves @@ Utils.lines_of_input 16 in
|
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 =
|
let best =
|
||||||
states
|
states
|
||||||
|> Iter.of_hashtbl
|
|> Iter.filter_map (fun (a_set, a_score) ->
|
||||||
|> Iter.diagonal
|
match Iter.find_pred (fun (b_set, _) -> StrSet.disjoint a_set b_set) states with
|
||||||
|> Iter.filter_map (fun ((a_set, a_score), (b_set, b_score)) ->
|
| Some (_, b_score) -> Some (a_score + b_score)
|
||||||
if StrSet.disjoint a_set b_set then Some (a_score + b_score) else None)
|
| None -> None)
|
||||||
|> Iter.fold Int.max 0
|
|> Iter.fold Int.max 0
|
||||||
in
|
in
|
||||||
Printf.printf "%i\n" @@ best;
|
Printf.printf "%i\n" @@ best;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user