res
}
+
+ pub fn reset_seen(&mut self) {
+ self.seen = vec![
+ vec![ Seen { top: false, right: false, bottom: false, left: false }; self.width]
+ ;
+ self.height
+ ];
+ }
}
fn run_part1(input: &str) -> Result<u64, Box<dyn Error>> {
fn run_part2(input: &str) -> Result<u64, Box<dyn Error>> {
println!("Running day16 - part 2");
- let res = 0;
+
+ let mut puzzle = Puzzle::new(input);
+
+ // le rayon provient de n'importe quelle case extérieure
+ let mut res: Vec<u64> = Vec::new();
+
+ // on teste le départ depuis toutes les cases verticales
+ (1..(puzzle.height - 1)).for_each(|i| {
+ let (direction, pos) = puzzle.get_next_from_left((i, 0))[0];
+ puzzle.move_beam(pos, direction);
+ res.push(puzzle.energized_tiles());
+
+ puzzle.reset_seen();
+
+ let (direction, pos) = puzzle.get_next_from_right((i, puzzle.width - 1))[0];
+ puzzle.move_beam(pos, direction);
+ res.push(puzzle.energized_tiles());
+
+ puzzle.reset_seen();
+ });
+
+ // on teste le départ depuis toutes les cases horizontales
+ (1..(puzzle.width - 1)).for_each(|i| {
+ let (direction, pos) = puzzle.get_next_from_top((0, i))[0];
+ puzzle.move_beam(pos, direction);
+ res.push(puzzle.energized_tiles());
+
+ puzzle.reset_seen();
+
+ let (direction, pos) = puzzle.get_next_from_bottom((puzzle.height - 1, i))[0];
+ puzzle.move_beam(pos, direction);
+ res.push(puzzle.energized_tiles());
+
+ puzzle.reset_seen();
+ });
+
+ //println!("{:?}", res);
+
+ let res = res.into_iter().max().unwrap();
Ok(res)
}
#[test]
fn day16_part2() {
let res = run_part2(TEXT_INPUT);
- assert_eq!(0, res.unwrap());
+ assert_eq!(51, res.unwrap());
}
}