From: alex <> Date: Sun, 8 Dec 2024 07:12:26 +0000 (+0100) Subject: Day08 refactor X-Git-Url: https://aoc.elinar.fr/?a=commitdiff_plain;h=b04f8d442dccd2acbc4e7380e17a1849f35ac852;p=aoc_2024 Day08 refactor --- diff --git a/src/day08.rs b/src/day08.rs index d7d680d..d9f976e 100644 --- a/src/day08.rs +++ b/src/day08.rs @@ -22,10 +22,7 @@ impl Puzzle { } } -fn run_part1(input: &str) -> Result> { - println!("Running {} - part 1", get_day()); - - let puzzle = Puzzle::new(input); +fn solve(puzzle: &Puzzle, depth: &[isize]) -> u32 { let mut visited: HashSet<(isize, isize)> = HashSet::new(); let mut antinodes: HashSet<(isize, isize)> = HashSet::new(); @@ -38,55 +35,36 @@ fn run_part1(input: &str) -> Result> { 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 (x1, x2) = if k <= key { (k, key) } else { (key, 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); + for i in depth { + for a in [(x1.0 + i*d.0, x1.1 + i*d.1), (x2.0 - i*d.0, x2.1 - i*d.1)] { + if puzzle.map.contains_key(&a) { + antinodes.insert(a); + } } } }); } }); - let res = antinodes.len() as u32; - Ok(res) + antinodes.len() as u32 } -fn run_part2(input: &str) -> Result> { - println!("Running {} - part 2", get_day()); - let puzzle = Puzzle::new(input); - let mut visited: HashSet<(isize, isize)> = HashSet::new(); - let mut antinodes: HashSet<(isize, isize)> = HashSet::new(); +fn run_part1(input: &str) -> Result> { + println!("Running {} - part 1", get_day()); - puzzle.map.iter() - .filter(|(_, value)| **value != '.') - .for_each(|(key, value)| { - if !visited.contains(key) { - visited.insert(*key); + let puzzle = Puzzle::new(input); + Ok(solve(&puzzle, &[1])) +} - 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 i in 0..puzzle.map.len() { - let i = i as isize; - for a in [(x1.0 + i*d.0, x1.1 + i*d.1), (x2.0 - i*d.0, x2.1 - i*d.1)] { - if puzzle.map.contains_key(&a) { - antinodes.insert(a); - } - } - } - }); - } - }); +fn run_part2(input: &str) -> Result> { + println!("Running {} - part 2", get_day()); - let res = antinodes.len() as u32; - Ok(res) + let puzzle = Puzzle::new(input); + let depth = (0..puzzle.map.len()).map(|v| v as isize).collect::>(); + Ok(solve(&puzzle, &depth)) } pub fn run(input: &str) -> Result<(), Box> {