From: alex <> Date: Fri, 6 Dec 2024 09:18:07 +0000 (+0100) Subject: Day06 - part 1 X-Git-Url: https://aoc.elinar.fr/?a=commitdiff_plain;h=18b1e89a2c4c4223a5b4fc105ea644ca85481867;p=aoc_2024 Day06 - part 1 --- diff --git a/src/day06.rs b/src/day06.rs new file mode 100644 index 0000000..9cd6be8 --- /dev/null +++ b/src/day06.rs @@ -0,0 +1,114 @@ +use std::error::Error; +use std::path::Path; +use std::collections::HashMap; + +struct Puzzle { + map: HashMap<(isize, isize), char>, + start: (isize, isize), +} + +impl Puzzle { + pub fn new(input: &str) -> Self { + let mut map: HashMap<(isize, isize), char> = HashMap::new(); + let mut start: (isize, isize) = (-1, -1); + + input.lines() + .enumerate() + .for_each(|(row, s)| { + s.chars() + .enumerate() + .for_each(|(col, c)| { + map.insert((row as isize, col as isize), c); + if c == '^' { + start = (row as isize, col as isize); + } + }); + }); + + Self { + map, + start, + } + } +} + +pub fn run(input: &str) -> Result<(), Box> { + let res = run_part1(&input)?; + println!("{res}"); + + let res = run_part2(&input)?; + println!("{res}"); + + Ok(()) +} + +fn get_day() -> String { + let filename = file!(); + Path::new(filename).file_stem().unwrap().to_str().unwrap().to_string() +} + +fn run_part1(input: &str) -> Result> { + println!("Running {} - part 1", get_day()); + + let mut turn_right: HashMap<(isize, isize), (isize, isize)> = HashMap::new(); + turn_right.insert((-1,0), (0,1)); + turn_right.insert((0,1), (1,0)); + turn_right.insert((1,0), (0,-1)); + turn_right.insert((0,-1), (-1,0)); + + let puzzle = Puzzle::new(input); + + let mut map = puzzle.map; + let mut pos: (isize, isize) = puzzle.start; + let mut dir: (isize, isize) = (-1, 0); + while map.contains_key(&pos) { + let mut c = map.get_mut(&pos).unwrap(); + if "^.".contains(*c) { + *c = 'X'; + } + if "#".contains(*c) { + pos = (pos.0 - dir.0, pos.1 - dir.1); + dir = *turn_right.get(&dir).unwrap(); + } + pos = (pos.0 + dir.0, pos.1 + dir.1); + } + + let res = map.into_iter() + .filter(|(_, c)| *c == 'X') + .count() as u32; + + Ok(res) +} + +fn run_part2(input: &str) -> Result> { + println!("Running {} - part 2", get_day()); + + Ok(0) +} + +#[cfg(test)] +mod tests { + use super::*; + + static TEXT_INPUT: &str = "\ +....#..... +.........# +.......... +..#....... +.......#.. +.......... +.#..^..... +........#. +#......... +......#..."; + + #[test] + fn test_part1() { + assert_eq!(41, run_part1(TEXT_INPUT).unwrap()); + } + + #[test] + fn test_part2() { + assert_eq!(0, run_part2(TEXT_INPUT).unwrap()); + } +} diff --git a/src/main.rs b/src/main.rs index 9760d8f..9d5ac55 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ pub mod day02; pub mod day03; pub mod day04; pub mod day05; +pub mod day06; fn main() { let args: Vec = env::args().collect(); @@ -36,6 +37,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box> { "day03" => day03::run(&input)?, "day04" => day04::run(&input)?, "day05" => day05::run(&input)?, + "day06" => day06::run(&input)?, _ => return Err(format!("unknown or unimplemented day \"{day}\"").into()), } Ok(())