From 7a94b00c1c5646d9af091d17b2efedf56416c920 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 11 Dec 2023 10:00:29 +0100 Subject: [PATCH] Day11 - part 1 --- src/day11.rs | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 2 + 2 files changed, 141 insertions(+) create mode 100644 src/day11.rs diff --git a/src/day11.rs b/src/day11.rs new file mode 100644 index 0000000..759a9bb --- /dev/null +++ b/src/day11.rs @@ -0,0 +1,139 @@ +use std::io::Read; +use std::error::Error; +use std::fs::File; + +pub fn run(input_file: &str) -> Result<(), Box> { + 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> { + 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> { + 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()); + } +} diff --git a/src/main.rs b/src/main.rs index fe39a4c..88d4d8e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ pub mod day07; pub mod day08; pub mod day09; pub mod day10; +pub mod day11; fn main() { let args: Vec = env::args().collect(); @@ -41,6 +42,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box> { "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(()) -- 2.39.5