From 260450a7027322f5c8538928008e0e4dc4661384 Mon Sep 17 00:00:00 2001 From: MaxJa4 <74194322+MaxJa4@users.noreply.github.com> Date: Thu, 21 Dec 2023 10:55:54 +0100 Subject: [PATCH] Part 11 --- src/bin/part11.rs | 124 ++++++++++++++++++++++++++++++ src/bin/sources/part11.sample | 10 +++ src/bin/sources/part11.txt | 140 ++++++++++++++++++++++++++++++++++ 3 files changed, 274 insertions(+) create mode 100644 src/bin/part11.rs create mode 100644 src/bin/sources/part11.sample create mode 100644 src/bin/sources/part11.txt diff --git a/src/bin/part11.rs b/src/bin/part11.rs new file mode 100644 index 0000000..5a8f998 --- /dev/null +++ b/src/bin/part11.rs @@ -0,0 +1,124 @@ +use std::time; + + +#[derive(Debug, Clone)] +#[allow(dead_code)] +struct Galaxy { + id: u16, + x: i16, + y: i16, +} + +fn main() { + let t1 = time::Instant::now(); + let mut galaxy_map = load_input(); + let d1 = t1.elapsed(); + println!("Loading: {:?}", d1); + + let t2 = time::Instant::now(); + expand_map(&mut galaxy_map); + //print_map(&galaxy_map); + let d2 = t2.elapsed(); + println!("Expanding: {:?}", d2); + + let t3 = time::Instant::now(); + let parsed_map = parse_map(&galaxy_map); + //println!("{:?}", parsed_map); + let d3 = t3.elapsed(); + println!("Parsing: {:?}", d3); + + let t4 = time::Instant::now(); + let distances = calc_distances(&parsed_map); + let d4 = t4.elapsed(); + println!("Calculating: {:?}", d4); + + let d5 = t1.elapsed(); + let sum_distances = distances.iter().sum::(); + println!("Summing: {:?}", d5); + println!("Total: {:?}", d1 + d2 + d3 + d4 + d5); + println!("Sum of distances: {}", sum_distances); +} + +fn calc_distances(galaxies: &Vec) -> Vec { + let mut distances = Vec::new(); + + for (i, g1) in galaxies.iter().enumerate() { + for g2 in &galaxies[i + 1..] { + let distance = ((g2.x - g1.x).abs() + (g2.y - g1.y).abs()) as u32; + distances.push(distance); + } + } + + distances +} + +fn parse_map(galaxy_map: &Vec>) -> Vec { + let mut galaxies = Vec::new(); + + for (y, row) in galaxy_map.iter().enumerate() { + for (x, c) in row.iter().enumerate() { + if *c { + galaxies.push(Galaxy { + id: galaxies.len() as u16 + 1, + x: x as i16, + y: y as i16, + }); + } + } + } + + galaxies +} + +#[allow(dead_code)] +fn print_map(galaxy_map: &Vec>) { + for row in galaxy_map { + for c in row { + print!("{}", if *c { '#' } else { '.' }); + } + println!(); + } +} + +fn expand_map(galaxy_map: &mut Vec>) { + let mut new_map = Vec::new(); + + for row in &mut *galaxy_map { + new_map.push(row.clone()); + if row.iter().all(|c| !*c) { + new_map.push(row.repeat(1_000_000)); + } + } + + let mut shift_offset = 0; + for (i, _) in galaxy_map[0].iter().enumerate() { + if galaxy_map.iter().all(|row| !row[i]) { + for row in new_map.iter_mut() { + row.insert(i + shift_offset, false); + } + shift_offset += 1; + } + } + + *galaxy_map = new_map; +} + +fn load_input() -> Vec> { + let data = std::fs::read_to_string("src/bin/sources/part11.txt") + .expect("Could not read file") + .lines() + .map(|line| { + line.chars() + .map(|c| { + match c { + '#' => true, + '.' => false, + _ => panic!("Invalid input") + } + }) + .collect::>() + }) + .collect::>(); + + data +} \ No newline at end of file diff --git a/src/bin/sources/part11.sample b/src/bin/sources/part11.sample new file mode 100644 index 0000000..a0bda53 --- /dev/null +++ b/src/bin/sources/part11.sample @@ -0,0 +1,10 @@ +...#...... +.......#.. +#......... +.......... +......#... +.#........ +.........# +.......... +.......#.. +#...#..... \ No newline at end of file diff --git a/src/bin/sources/part11.txt b/src/bin/sources/part11.txt new file mode 100644 index 0000000..e89d7f7 --- /dev/null +++ b/src/bin/sources/part11.txt @@ -0,0 +1,140 @@ +.......#.....#.....................#.............#.................#.........................#.............................................. +#.....................#.......#.................................................................................#.......#................... +.......................................................................#.........................#..................................#....... +................................................................#..............#..............................................#............. +.........................................#............................................................#....................................# +.................#..................................................#....................................................................... +...........................#...............................................................................#................................ +....#.......#...........................................#..........................#.............................#.......................... +....................#.............#........#................................................................................................ +...................................................#...................................................#...................#................ +.........................#........................................#..................................................#...................... +......#..........#...........................................#...........#............#..................................................... +......................................#..........................................#.........................#.....................#.......... +.#...................#..................................#.......................................#........................................... +............#.................................#.....................#....................................................................... +............................................................................................................................................ +..............................#.....................................................................................#..................#.... +....................................................................................#........#......#....................................... +.........................#.........................#............#...........................................#............................... +.#......#.....#.......................#.................#........................................................#.....#.................... +...........................................................................#.................................................#.............. +...............................................#.......................................#...............#..........................#......... +......................#..................#.................................................................................................. +..........................................................................................................................#................. +......#...........................#.........................................................#........................#...................... +..............................................................................................................................#............. +..#.......................#.................#............................................................................................#.. +..................#....................................................#................#................................................... +....................................................#.....#....................#............................................................ +...............................#............................................................................................................ +..............................................#...............#..........................................................#...........#...... +.#.........#........................#..................................................................#.................................... +..........................................................................#.......................#........................................# +...................#......................................................................#................................................. +.............................................................................................................................#.............. +.....#...................................................................................................................................... +........................................................#........................#.......................................................... +.............................#...............#.....................#.....#............#..................#..............................#... +............................................................................................#......#...........#............................ +.........................#........#...................................................................................#..................... +...........................................................................................................................................# +.....................................................#.....#.................................................................#.............. +#.........................................................................................................#.......................#......... +................#...........................................................#.....................#......................................... +..............................#..............#...................................#.......#...........................#...................... +........#................#.........#............................#............................................#.............#.........#...... +............................................................................................................................................ +.......................................................#...............#.............................#...........................#.......... +.............#.................................#............................................................................................ +............................................................................................................................................ +..#.............................................................................#...........................................#...........#... +............................................................................................................................................ +......................................#..........................................................#................#......................... +............................#................#......#......................#...........#.................................................... +............................................................................................................................................ +....................................................................................................#................#..........#........... +.#............#...................#...............................#........................................#.............................#.. +.........#...............................................................#.................................................................. +.......................#....................#........#...........................................#.......................................... +............................................................#.....................................................#......................... +..............................#.......................................................................#...................#.......#......... +............#.......................#...................#............................#...................................................... +...................................................#......................................#..............................................#.. +.#................#...................................................#........................#............................................ +......#....................................................................#................................#............................... +...............................#....................................................................................#....................... +.........................#.....................#......#.............................................#.................................#..... +............................................................................................................................................ +...............#.....................#....................................................#................................................. +..................................................................................................................#......................... +....#......#.....................................#..............................#............................#............#.....#........... +....................#.............................................#....................#.........#.......................................#.. +.........................................................#..............#.............................#..................................... +............................#...........#...........................................................................#....................... +............................................................................................................................................ +#..................................#...............................................................#..........#............................. +.......#......................................................................................#.................................#.......#... +.....................#....................#...............................#.....#......................................#.................... +................................#..........................#......#....................#..........................#......................... +..............#...................................#........................................................................#...............# +....#....................................................................................................#.................................. +.......................#.................................................................................................................... +......................................#................................#..................#................................................. +.....................................................#............................................#...............................#......... +............................................................................................................................................ +............................................................................................................................................ +....#.................#..................................#.........................#..........................#............................. +.............#........................................................................................#..................#.................. +......................................#............................................................................#........................ +.........#....................................................#.........#............................................................#...... +.............................................................................................#.............................................. +.............................#...........#............................................................................#..................... +#..................#................................................#....................#.......................................#.........# +...................................................................................................#......#................................. +...........#.............................................#...........................#...................................................... +....................................#....................................................................................................... +..................................................#..........#.........#......................#.....................#....................... +.#......#....................................#..............................................................#............................... +.............................#.............................................#................................................................ +.......................#...............................................................................#....................#............... +....................................................#.....................................#...........................................#..... +................#.....................#..................#.................................................................................# +...#.....#..........................................................#................#...................................................... +.............................................#...............#................................#......#...................................... +...............................#...............................................#............................................................ +.............................................................................................................................#.........#.... +.....................#................................................#.................................................#................... +...............#.........................#.......................#..................#....................................................... +.....#......................................................................................................#.......................#....... +....................................#.................#.........................#..................#........................................ +........................................................................................................................................#... +.........#..............#.....................................#........................................#.....................#.............. +...............................................#...................#........................................................................ +......................................#.............#..................................#.....#.......................#...................... +............#.....#...............................................................................#......................................... +...#...................................................................................................................................#.... +.......................#.........................#.......................................................................................... +.........................................................#...........#.........................#........#..........#.............#.......... +............................#..............#....................#........................................................#.................. +.......#.................................................................#................#................................................. +.................#..................................................................................#........................#...........#.. +...................................................#.......#................................................................................ +.........................................#......................................#......................................#.................... +....................................#...........................................................................#........................... +..............................#.............................................................#...........#.......................#......#.... +.........#...............................................#..............#................................................................... +........................#....................#.....................................#........................................................ +#........................................................................................................................................... +............................#......................................................................#.......#................................ +......................................#..................................................................................................... +.....#............#.........................................#..........................#..........................................#......... +...........................................#......................#..............................................#.......................... +..............#..............................................................................#............................#.............#... +..#......#...........................................#..............................#..................#.....#.............................. +....................#..........#.....#...............................#...................................................................... +............................................................................................................................................ +.................................................#.......................................................................................... +.............#..........#...............................#...............#.............#..........#.........#........#....................... +............................................#................#.................#............................................................ +....................................#....................................................................................#.............#.... \ No newline at end of file