2022 day 16 refactor

This commit is contained in:
Maciej Jur 2022-12-17 10:07:30 +01:00
parent 5f333096e8
commit 1a8917975c

View file

@ -101,7 +101,6 @@ fn release_bitmap(valves: &[Valve], bitmap: u64) -> u32 {
struct MoveState { struct MoveState {
curr: usize, curr: usize,
next: usize, next: usize,
closed: u64,
time_left: u32, time_left: u32,
released: u32, released: u32,
} }
@ -113,26 +112,23 @@ fn move_to_open(
state: MoveState, state: MoveState,
) -> u32 { ) -> u32 {
let distance = state.time_left.min(*distances.get(&(state.curr, state.next)).unwrap()); let distance = state.time_left.min(*distances.get(&(state.curr, state.next)).unwrap());
let released = state.released + release_bitmap(valves, state.closed) * distance; if distance == state.time_left { return state.released };
if distance == state.time_left { return released };
let curr = state.next; let curr = state.next;
let released = released + release_bitmap(valves, state.closed);
let closed_bm = state.closed ^ (1 << curr);
let closed = { let mut closed = closed.clone(); closed.remove(&curr); closed }; let closed = { let mut closed = closed.clone(); closed.remove(&curr); closed };
let time_left = state.time_left - distance - 1; let time_left = state.time_left - distance - 1;
let released = state.released + valves[curr].rate * time_left;
closed.iter() closed.iter()
.map(|&next| move_to_open(valves, distances, &closed, MoveState { curr, next, closed: closed_bm, time_left, released })) .map(|&next| move_to_open(valves, distances, &closed, MoveState { curr, next, time_left, released }))
.max() .max()
.unwrap_or_else(|| released + release_bitmap(valves, closed_bm) * time_left) .unwrap_or(released)
} }
fn find_max_for_start(valves: &[Valve], start: usize, limit: u32) -> u32 { fn find_max_for_start(valves: &[Valve], start: usize, limit: u32) -> u32 {
move_to_open(&valves, &find_distances(&valves), &closed_valves(valves), MoveState { move_to_open(&valves, &find_distances(&valves), &closed_valves(valves), MoveState {
curr: start, curr: start,
next: start, next: start,
closed: closed_bitmap(valves),
time_left: limit + 1, time_left: limit + 1,
released: 0, released: 0,
}) })