]> aoc.elinar.fr Git - aoc_2024/commitdiff
Day08 - part2
authoralex <>
Sun, 8 Dec 2024 05:59:05 +0000 (06:59 +0100)
committeralex <>
Sun, 8 Dec 2024 05:59:05 +0000 (06:59 +0100)
Je ne m’attendais pas à ce que ça juste fonctionne comme approche.

src/day08.rs

index 67a69daec9b9f81c84dd5ee6df83990d22378c16..d7d680daba71b3e1bacc1377656298d18bbd22ea 100644 (file)
@@ -57,7 +57,36 @@ fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
 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>> {
@@ -100,6 +129,6 @@ mod tests {
 
     #[test]
     fn test_part2() {
-        assert_eq!(0, run_part2(TEXT_INPUT).unwrap());
+        assert_eq!(34, run_part2(TEXT_INPUT).unwrap());
     }
 }