2022 day 16 part 1

This commit is contained in:
Maciej Jur 2022-12-16 19:09:35 +01:00
parent 10e85ffcb9
commit b060db104e

View file

@ -84,43 +84,57 @@ fn find_distances<'data, 'a>(map: &'a HashMap<&'data str, &'a Valve<'data>>, dat
.collect::<HashMap<_, _>>()
}
struct MoveState<'data> {
curr: &'data str,
next: &'data str,
time_left: u32,
released: u32,
}
fn move_to_open<'data, 'a>(
map: &'a HashMap<&'data str, &'a Valve<'data>>,
distances: &'a HashMap<(&'data str, &'data str), u32>,
closed: &'a HashSet<&'data str>,
opened: &'a HashSet<&'data str>,
curr: &'data str,
next: &'data str,
time_left: u32,
released: u32,
state: MoveState,
) -> u32 {
let distance = *distances.get(&(curr, next)).unwrap().min(&time_left);
let released = released + release_pressure(map, opened) * distance;
if distance == time_left { return released };
let curr = next;
let distance = *distances.get(&(state.curr, state.next)).unwrap().min(&state.time_left);
let released = state.released + release_pressure(map, opened) * distance;
if distance == state.time_left { return released };
let curr = state.next;
let released = released + release_pressure(map, opened);
let closed = { let mut closed = closed.clone(); closed.remove(curr); closed };
let opened = { let mut opened = opened.clone(); opened.insert(curr); opened };
let time_left = time_left - distance - 1;
let time_left = state.time_left - distance - 1;
closed.iter()
.map(|&next| move_to_open(map, distances, &closed, &opened, curr, next, time_left, released))
.map(|&next| move_to_open(map, distances, &closed, &opened, MoveState { curr, next, time_left, released }))
.max()
.unwrap_or_else(|| released + release_pressure(map, &opened) * time_left)
}
fn find_max_for_start(data: &[Valve], start: &str, limit: u32) -> u32 {
let map = build_map(data);
let distances = find_distances(&map, data);
let closed = closed_valves(data);
move_to_open(&map, &distances, &closed, &HashSet::new(), start, start, limit + 1, 0)
let start_state = MoveState { curr: start, next: start, time_left: limit + 1, released: 0 };
move_to_open(&map, &find_distances(&map, data), &closed_valves(data), &HashSet::new(), start_state)
}
fn solve1(data: &[Valve]) -> u32 {
find_max_for_start(data, "AA", 30)
}
struct ParallelMoveState<'data> {
p_curr: &'data str,
p_next: &'data str,
p_progress: u32,
e_curr: &'data str,
e_next: &'data str,
e_progress: u32,
time_left: u32,
released: u32,
}
fn solve2(data: &[Valve]) -> i32 {
2
}