]> aoc.elinar.fr Git - aoc_2023/commitdiff
Day11 - part 1
authoralex <null>
Mon, 11 Dec 2023 09:00:29 +0000 (10:00 +0100)
committeralex <null>
Mon, 11 Dec 2023 09:00:29 +0000 (10:00 +0100)
src/day11.rs [new file with mode: 0644]
src/main.rs

diff --git a/src/day11.rs b/src/day11.rs
new file mode 100644 (file)
index 0000000..759a9bb
--- /dev/null
@@ -0,0 +1,139 @@
+use std::io::Read;
+use std::error::Error;
+use std::fs::File;
+
+pub fn run(input_file: &str) -> Result<(), Box<dyn Error>> {
+    let mut f = File::open(input_file)?;
+    let mut input = String::new();
+    f.read_to_string(&mut input)?;
+
+    let res = run_part1(&input)?;
+    println!("{res}");
+
+    let res = run_part2(&input)?;
+    println!("{res}");
+
+    Ok(())
+}
+
+fn dst(a: (usize, usize), b: (usize, usize)) -> u32 {
+    (a.0.abs_diff(b.0) + a.1.abs_diff(b.1)) as u32
+}
+
+#[derive(Debug)]
+struct Puzzle {
+    coord: Vec<(usize, usize)>,
+    width: usize,
+    height: usize,
+}
+
+impl Puzzle {
+    pub fn new_with_exapansion(input: &str) -> Self {
+        let mut width = 0;
+        let mut height = 0;
+
+        let mut row: usize = 0;
+        let coord: Vec<(usize, usize)> = input.lines()
+            .filter(|l| !l.is_empty())
+            .flat_map(|l| {
+                if width == 0 {
+                    width = l.chars().count();
+                }
+                let galaxies: Vec<(usize, usize)> = l.chars()
+                    .enumerate()
+                    .filter_map(|(col, c)| {
+                        match c {
+                            '#' => Some((row, col)),
+                            _ => None,
+                        }
+                    })
+                    .collect();
+                height += 1;
+                row += 1;
+                // prise en compte de l'expansion en ligne
+                if !l.contains('#') {
+                    row += 1;
+                }
+                galaxies
+            })
+            .collect();
+
+        // prise en compte de l'expansion en colonne
+        // parcours en colonne et écarter les colonnes des galaxies
+        let mut new_coord = Vec::new();
+        let mut col = 0;
+        for i in 0..width {
+            let tmp = coord.iter()
+                .filter(|c| c.1 == i);
+            if tmp.clone().count() == 0 {
+                col += 1;
+            } else {
+                tmp.for_each(|c| { new_coord.push((c.0, c.1 + col)); });
+            }
+        }
+
+        Self {
+            coord: new_coord,
+            width,
+            height,
+        }
+    }
+}
+
+fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
+    println!("Running day11 - part 1");
+
+    let puzzle = Puzzle::new_with_exapansion(input);
+    let coord = puzzle.coord;
+
+    let n = coord.len();
+    let res: u32 = coord.iter().enumerate()
+        .map(|(i, &a)| {
+            let mut sum: u32 = 0;
+            for j in (i + 1)..n {
+                //println!("a({}, {}) - b({},{})", a.0, a.1, coord[j].0, coord[j].1);
+                sum += dst(a, coord[j]);
+            }
+            // retourner la sum des distances
+            sum
+        })
+        .sum();
+
+    Ok(res)
+}
+
+fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
+    println!("Running day11 - part 2");
+    let res = 0;
+    Ok(res)
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    static TEXT_INPUT: &str = "\
+...#......
+.......#..
+#.........
+..........
+......#...
+.#........
+.........#
+..........
+.......#..
+#...#.....
+";
+
+    #[test]
+    fn day11_part1() {
+        let res = run_part1(TEXT_INPUT);
+        assert_eq!(374, res.unwrap());
+    }
+
+    #[test]
+    fn day11_part2() {
+        let res = run_part2(TEXT_INPUT);
+        assert_eq!(0, res.unwrap());
+    }
+}
index fe39a4c509283ac1fd28259bd8e1f15c5fd03c50..88d4d8e7190da3967d4c37d999735bb413d4e748 100644 (file)
@@ -13,6 +13,7 @@ pub mod day07;
 pub mod day08;
 pub mod day09;
 pub mod day10;
+pub mod day11;
 
 fn main() {
     let args: Vec<String> = env::args().collect();
@@ -41,6 +42,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box<dyn Error>> {
         "day08" => day08::run(input_file)?,
         "day09" => day09::run(input_file)?,
         "day10" => day10::run(input_file)?,
+        "day11" => day11::run(input_file)?,
         _ => return Err(format!("unknown day \"{day}\"").into()),
     }
     Ok(())