get rid of old day 16 solution
This commit is contained in:
parent
2a515a5323
commit
f2f3e497d6
89
src/day16.ml
89
src/day16.ml
|
|
@ -60,30 +60,16 @@ let parse_valves lines =
|
||||||
valves, get_dist
|
valves, get_dist
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let find_best get_dist =
|
|
||||||
let rec traverse' valves time elephant current =
|
|
||||||
let options =
|
|
||||||
valves
|
|
||||||
|> List.filter_map (fun (name, flow) ->
|
|
||||||
let dist = get_dist current name in
|
|
||||||
let delta = dist + 1 in
|
|
||||||
let score = flow * (time - delta) in
|
|
||||||
if score < 0
|
|
||||||
then None
|
|
||||||
else (
|
|
||||||
let valves' = List.remove_assoc ~eq:String.equal name valves in
|
|
||||||
Some (score + traverse' valves' (time - delta) elephant name)))
|
|
||||||
in
|
|
||||||
(options @ if elephant then [ traverse' valves 26 false "AA" ] else [ 0 ])
|
|
||||||
|> List.reduce Int.max
|
|
||||||
|> Option.get_or ~default:0
|
|
||||||
in
|
|
||||||
traverse'
|
|
||||||
;;
|
|
||||||
|
|
||||||
module StrSet = Set.Make (String)
|
module StrSet = Set.Make (String)
|
||||||
|
|
||||||
let traverse get_dist valves current time released opened =
|
let traverse
|
||||||
|
get_dist
|
||||||
|
valves
|
||||||
|
?(current = "AA")
|
||||||
|
?(released = 0)
|
||||||
|
?(opened = StrSet.empty)
|
||||||
|
time
|
||||||
|
=
|
||||||
let states = Hashtbl.create 1000 in
|
let states = Hashtbl.create 1000 in
|
||||||
let rec traverse' current time released opened =
|
let rec traverse' current time released opened =
|
||||||
Hashtbl.update
|
Hashtbl.update
|
||||||
|
|
@ -107,51 +93,46 @@ let traverse get_dist valves current time released opened =
|
||||||
in
|
in
|
||||||
traverse' current time released opened;
|
traverse' current time released opened;
|
||||||
states
|
states
|
||||||
|
|> Iter.of_hashtbl
|
||||||
|
|> Iter.sort ~cmp:(fun (_, a_score) (_, b_score) -> b_score - a_score)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let%expect_test "example" =
|
let solve_part_1 lines =
|
||||||
let valves, get_dist = parse_valves example_lines in
|
let valves, get_dist = parse_valves lines in
|
||||||
Printf.printf "part 1: %i\n" @@ find_best get_dist valves 30 false "AA";
|
let states = traverse get_dist valves 30 in
|
||||||
Printf.printf "part 2: %i\n" @@ find_best get_dist valves 26 true "AA";
|
match states |> Iter.take 1 |> Iter.to_list with
|
||||||
[%expect {|
|
| [ (_, score) ] -> score
|
||||||
part 1: 1651
|
| _ -> failwith "no traversals ?"
|
||||||
part 2: 1707 |}]
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let%expect_test "Day 16.1 example" =
|
let%expect_test "Day 16.1 example" =
|
||||||
let valves, get_dist = parse_valves example_lines in
|
Printf.printf "%i\n" @@ solve_part_1 example_lines;
|
||||||
Printf.printf "%i\n" @@ find_best get_dist valves 30 false "AA";
|
|
||||||
[%expect {| 1651 |}]
|
[%expect {| 1651 |}]
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let%expect_test "Day 16.2 example" =
|
let%expect_test "Day 16.1" =
|
||||||
let valves, get_dist = parse_valves example_lines in
|
Printf.printf "%i\n" @@ solve_part_1 @@ Utils.lines_of_input 16;
|
||||||
Printf.printf "%i\n" @@ find_best get_dist valves 26 true "AA";
|
[%expect {| 2265 |}]
|
||||||
[%expect {| 1707 |}]
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let%expect_test "Day 16.1" =
|
let solve_part_2 lines =
|
||||||
let valves, get_dist = parse_valves @@ Utils.lines_of_input 16 in
|
let valves, get_dist = parse_valves @@ lines in
|
||||||
Printf.printf "%i\n" @@ find_best get_dist valves 30 false "AA";
|
let states = traverse get_dist valves 26 in
|
||||||
[%expect {| 2265 |}]
|
states
|
||||||
|
|> 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
|
||||||
|
;;
|
||||||
|
|
||||||
|
let%expect_test "Day 16.2 example" =
|
||||||
|
Printf.printf "%i\n" @@ solve_part_2 example_lines;
|
||||||
|
[%expect {| 1707 |}]
|
||||||
;;
|
;;
|
||||||
|
|
||||||
(* down to 1.5 seconds! bitmasks ???? *)
|
(* 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
|
Printf.printf "%i\n" @@ solve_part_2 @@ Utils.lines_of_input 16;
|
||||||
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.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;
|
|
||||||
[%expect {| 2811 |}]
|
[%expect {| 2811 |}]
|
||||||
;;
|
;;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user