mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Implement 2023 day 16 part 2
This commit is contained in:
@@ -14,15 +14,12 @@ impl Direction {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn part1(input: &[u8]) -> anyhow::Result<String> {
|
fn compute_energized(
|
||||||
let map = Grid::new(input)?;
|
map: &Grid<&[u8]>,
|
||||||
let mut state = Grid::zeroed(map.width(), map.height());
|
state: &mut Grid<Vec<u8>>,
|
||||||
state[0][0] = Direction::Right.bit();
|
todo: &mut Vec<(Direction, usize, usize)>,
|
||||||
|
) -> u32 {
|
||||||
let mut todo = Vec::new();
|
let mut energized = todo.len() as u32;
|
||||||
todo.push((Direction::Right, 0, 0));
|
|
||||||
|
|
||||||
let mut energized = 1;
|
|
||||||
|
|
||||||
while let Some((dir, x, y)) = todo.pop() {
|
while let Some((dir, x, y)) = todo.pop() {
|
||||||
let mut enqueue = |dir: Direction, x: usize, y| {
|
let mut enqueue = |dir: Direction, x: usize, y| {
|
||||||
@@ -90,11 +87,51 @@ pub fn part1(input: &[u8]) -> anyhow::Result<String> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(energized.to_string())
|
energized
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn part2(_input: &[u8]) -> anyhow::Result<String> {
|
pub fn part1(input: &[u8]) -> anyhow::Result<String> {
|
||||||
anyhow::bail!("Not implemented")
|
let map = Grid::new(input)?;
|
||||||
|
let mut state = Grid::zeroed(map.width(), map.height());
|
||||||
|
state[0][0] = Direction::Right.bit();
|
||||||
|
|
||||||
|
let mut todo = Vec::new();
|
||||||
|
todo.push((Direction::Right, 0, 0));
|
||||||
|
|
||||||
|
Ok(compute_energized(&map, &mut state, &mut todo).to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn reset_state(state: &mut Grid<Vec<u8>>) {
|
||||||
|
for row in state.rows_mut() {
|
||||||
|
row.fill(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part2(input: &[u8]) -> anyhow::Result<String> {
|
||||||
|
let map = Grid::new(input)?;
|
||||||
|
let mut state = Grid::zeroed(map.width(), map.height());
|
||||||
|
let mut todo = Vec::new();
|
||||||
|
|
||||||
|
let mut helper = |dir: Direction, x, y| {
|
||||||
|
todo.push((dir, x, y));
|
||||||
|
reset_state(&mut state);
|
||||||
|
state[y][x] = dir.bit();
|
||||||
|
|
||||||
|
compute_energized(&map, &mut state, &mut todo)
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut best = 0;
|
||||||
|
for x in 0..map.width() {
|
||||||
|
best = Ord::max(best, helper(Direction::Down, x, 0));
|
||||||
|
best = Ord::max(best, helper(Direction::Up, x, map.height() - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
for y in 0..map.height() {
|
||||||
|
best = Ord::max(best, helper(Direction::Down, 0, y));
|
||||||
|
best = Ord::max(best, helper(Direction::Up, map.width() - 1, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(best.to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@@ -108,8 +145,8 @@ mod tests {
|
|||||||
assert_eq!("46", part1(SAMPLE).unwrap());
|
assert_eq!("46", part1(SAMPLE).unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
// #[test]
|
#[test]
|
||||||
// fn sample_part2() {
|
fn sample_part2() {
|
||||||
// assert_eq!("64", part2(SAMPLE).unwrap());
|
assert_eq!("51", part2(SAMPLE).unwrap());
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user