brute force day 16.1 with incorrect algorithm lol

it gets the right answer for the input but not for the example input
This commit is contained in:
ryan 2023-11-21 18:16:53 -08:00
parent 8270ee7aa8
commit b9a36a476a
2 changed files with 136 additions and 0 deletions

60
inputs/day16.tt Normal file
View File

@ -0,0 +1,60 @@
Valve XB has flow rate=0; tunnels lead to valves WZ, LE
Valve BM has flow rate=0; tunnels lead to valves PL, RI
Valve GC has flow rate=0; tunnels lead to valves HN, IT
Valve RM has flow rate=0; tunnels lead to valves ZQ, YL
Valve ZM has flow rate=5; tunnels lead to valves SN, KE, UW, MY, GW
Valve UH has flow rate=0; tunnels lead to valves HM, HN
Valve GW has flow rate=0; tunnels lead to valves LE, ZM
Valve HN has flow rate=19; tunnels lead to valves UW, UH, GL, WZ, GC
Valve VT has flow rate=0; tunnels lead to valves ZD, PE
Valve VI has flow rate=0; tunnels lead to valves JS, AA
Valve YL has flow rate=12; tunnels lead to valves PM, MH, RM, CM
Valve LA has flow rate=0; tunnels lead to valves SN, IY
Valve CM has flow rate=0; tunnels lead to valves YL, UL
Valve JI has flow rate=24; tunnels lead to valves UV, WH, XW, OJ
Valve ZD has flow rate=25; tunnels lead to valves VB, XW, VT
Valve VB has flow rate=0; tunnels lead to valves QX, ZD
Valve FO has flow rate=0; tunnels lead to valves WH, PE
Valve JS has flow rate=0; tunnels lead to valves VI, IY
Valve RI has flow rate=0; tunnels lead to valves PE, BM
Valve XD has flow rate=14; tunnel leads to valve CP
Valve ES has flow rate=11; tunnels lead to valves GU, WU
Valve WZ has flow rate=0; tunnels lead to valves XB, HN
Valve HW has flow rate=0; tunnels lead to valves QY, LE
Valve KE has flow rate=0; tunnels lead to valves AA, ZM
Valve IY has flow rate=22; tunnels lead to valves JS, AB, LA, IT
Valve XW has flow rate=0; tunnels lead to valves ZD, JI
Valve BE has flow rate=0; tunnels lead to valves AB, LE
Valve QY has flow rate=23; tunnels lead to valves AM, HW, MY
Valve MH has flow rate=0; tunnels lead to valves YL, AM
Valve IT has flow rate=0; tunnels lead to valves GC, IY
Valve DA has flow rate=0; tunnels lead to valves QR, CP
Valve PM has flow rate=0; tunnels lead to valves LE, YL
Valve WU has flow rate=0; tunnels lead to valves SM, ES
Valve UL has flow rate=0; tunnels lead to valves CM, QR
Valve SM has flow rate=13; tunnel leads to valve WU
Valve XC has flow rate=0; tunnels lead to valves ZJ, AA
Valve OJ has flow rate=0; tunnels lead to valves GI, JI
Valve SN has flow rate=0; tunnels lead to valves LA, ZM
Valve WH has flow rate=0; tunnels lead to valves JI, FO
Valve UW has flow rate=0; tunnels lead to valves HN, ZM
Valve HM has flow rate=0; tunnels lead to valves UH, PE
Valve AB has flow rate=0; tunnels lead to valves BE, IY
Valve QR has flow rate=8; tunnels lead to valves WW, UL, DA
Valve UV has flow rate=0; tunnels lead to valves JI, FF
Valve ZQ has flow rate=20; tunnel leads to valve RM
Valve ZJ has flow rate=0; tunnels lead to valves PE, XC
Valve GL has flow rate=0; tunnels lead to valves HN, PL
Valve CP has flow rate=0; tunnels lead to valves DA, XD
Valve AM has flow rate=0; tunnels lead to valves QY, MH
Valve PL has flow rate=17; tunnels lead to valves GL, YE, BM, FF, QX
Valve YE has flow rate=0; tunnels lead to valves PL, AA
Valve PE has flow rate=4; tunnels lead to valves FO, RI, ZJ, VT, HM
Valve MY has flow rate=0; tunnels lead to valves QY, ZM
Valve QX has flow rate=0; tunnels lead to valves VB, PL
Valve GI has flow rate=0; tunnels lead to valves OJ, AA
Valve WW has flow rate=0; tunnels lead to valves GU, QR
Valve FF has flow rate=0; tunnels lead to valves UV, PL
Valve LE has flow rate=6; tunnels lead to valves HW, GW, XB, BE, PM
Valve GU has flow rate=0; tunnels lead to valves ES, WW
Valve AA has flow rate=0; tunnels lead to valves KE, GI, VI, YE, XC

76
src/day16.ml Normal file
View File

@ -0,0 +1,76 @@
open Containers
let example_lines =
String.lines
{|Valve AA has flow rate=0; tunnels lead to valves DD, II, BB
Valve BB has flow rate=13; tunnels lead to valves CC, AA
Valve CC has flow rate=2; tunnels lead to valves DD, BB
Valve DD has flow rate=20; tunnels lead to valves CC, AA, EE
Valve EE has flow rate=3; tunnels lead to valves FF, DD
Valve FF has flow rate=0; tunnels lead to valves EE, GG
Valve GG has flow rate=0; tunnels lead to valves FF, HH
Valve HH has flow rate=22; tunnel leads to valve GG
Valve II has flow rate=0; tunnels lead to valves AA, JJ
Valve JJ has flow rate=21; tunnel leads to valve II
|}
;;
type valve =
{ name : string
; flow : int
; tunnels : string list
}
[@@deriving show { with_path = false }]
let parse_valve line =
let int_matches = List.map int_of_string Re.(matches (Pcre.regexp {|\d+|}) line) in
let valve_matches = Re.(matches (Pcre.regexp {|[A-Z]{2}|}) line) in
match int_matches, valve_matches with
| [ flow ], name :: tunnels -> name, { name; flow; tunnels }
| _ -> failwith "parse error"
;;
let solve_part_1 lines =
let valves = Hashtbl.create 100 in
lines
|> List.iter (fun line ->
let name, valve = parse_valve line in
Hashtbl.add valves name valve);
let get_valve name = Option.get_exn_or "poo" @@ Hashtbl.get valves name in
let traverse =
Utils.memo (fun self released current time opened visited ->
if time = 0
then released
else (
let open_current =
if current.flow > 0 && (not @@ List.mem current.name opened)
then (
let time' = time - 1 in
let released' = released + (current.flow * time') in
[ self released' current time' (current.name :: opened) visited ])
else []
in
let follow_a_tunnel =
current.tunnels
|> List.filter (fun tunnel -> not @@ List.mem tunnel visited)
|> List.map (fun name ->
let current' = get_valve name in
let time' = time - 1 in
self released current' time' opened (current.name :: visited))
in
Option.get_or ~default:released
@@ List.reduce Int.max (open_current @ follow_a_tunnel)))
in
let start = get_valve "AA" in
traverse 0 start 30 [] []
;;
let%expect_test "Day 16.1 example" =
Printf.printf "%i\n" @@ solve_part_1 @@ example_lines;
[%expect {| 1651 |}]
;;
let%expect_test "Day 16.1" =
Printf.printf "%i" @@ solve_part_1 @@ Utils.lines_of_input 16;
[%expect {| 2265 |}]
;;