fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
println!("Running {} - part 2", get_day());
- Ok(0)
+ 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 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);
+ }
+ }
+ }
+ });
+ }
+ });
+
+ let res = antinodes.len() as u32;
+ Ok(res)
}
pub fn run(input: &str) -> Result<(), Box<dyn Error>> {
#[test]
fn test_part2() {
- assert_eq!(0, run_part2(TEXT_INPUT).unwrap());
+ assert_eq!(34, run_part2(TEXT_INPUT).unwrap());
}
}