--- /dev/null
+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());
+ }
+}