From: alex <> Date: Sun, 8 Dec 2024 05:52:10 +0000 (+0100) Subject: Day08 - part 1 X-Git-Url: https://aoc.elinar.fr/?a=commitdiff_plain;h=87e6876c5bc6ac46fdcba370ea8ca5fb183b7644;p=aoc_2024 Day08 - part 1 --- diff --git a/src/day08.rs b/src/day08.rs new file mode 100644 index 0000000..67a69da --- /dev/null +++ b/src/day08.rs @@ -0,0 +1,105 @@ +use std::error::Error; +use std::path::Path; +use std::collections::{HashMap, HashSet}; + +struct Puzzle { + map: HashMap<(isize, isize), char>, +} + +impl Puzzle { + pub fn new(input: &str) -> Self { + let mut map = HashMap::new(); + input.lines() + .enumerate() + .for_each(|(row, l)| { + l.chars() + .enumerate() + .for_each(|(col, c)| { + map.insert((row as isize, col as isize), c); + }); + }); + Self { map } + } +} + +fn run_part1(input: &str) -> Result> { + println!("Running {} - part 1", get_day()); + + let puzzle = Puzzle::new(input); + let mut visited: HashSet<(isize, isize)> = HashSet::new(); + let mut antinodes: HashSet<(isize, isize)> = HashSet::new(); + + puzzle.map.iter() + .filter(|(_, value)| **value != '.') + .for_each(|(key, value)| { + if !visited.contains(key) { + visited.insert(*key); + + puzzle.map.iter() + .filter(|(k, v)| *v == value && *k != key) + .for_each(|(k, v)| { + let x1 = if k <= key { k } else { key }; + let x2 = if k <= key { key } else { k }; + let d = (x1.0 - x2.0, x1.1 - x2.1); + for a in [(x1.0 + d.0, x1.1 + d.1), (x2.0 - d.0, x2.1 - d.1)] { + if puzzle.map.contains_key(&a) { + antinodes.insert(a); + } + } + }); + } + }); + + let res = antinodes.len() as u32; + Ok(res) +} + +fn run_part2(input: &str) -> Result> { + println!("Running {} - part 2", get_day()); + + Ok(0) +} + +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() +} + +#[cfg(test)] +mod tests { + use super::*; + + static TEXT_INPUT: &str = "\ +............ +........0... +.....0...... +.......0.... +....0....... +......A..... +............ +............ +........A... +.........A.. +............ +............"; + + #[test] + fn test_part1() { + assert_eq!(14, 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 a3058a0..d3f9981 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ pub mod day04; pub mod day05; pub mod day06; pub mod day07; +pub mod day08; fn main() { let args: Vec = env::args().collect(); @@ -40,6 +41,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box> { "day05" => day05::run(&input)?, "day06" => day06::run(&input)?, "day07" => day07::run(&input)?, + "day08" => day08::run(&input)?, _ => return Err(format!("unknown or unimplemented day \"{day}\"").into()), } Ok(())