day 11
This commit is contained in:
parent
f1f6f0f79c
commit
772e220f46
7
day11/Cargo.lock
generated
Normal file
7
day11/Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "day11"
|
||||
version = "0.1.0"
|
8
day11/Cargo.toml
Normal file
8
day11/Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "day11"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
140
day11/input.txt
Normal file
140
day11/input.txt
Normal file
@ -0,0 +1,140 @@
|
||||
.........................#.........................#.....................#........#..................#............#...............#.........
|
||||
............................................................................................................................................
|
||||
...................................#......................#.................................................................................
|
||||
............................................................................................#..........................#.....#..............
|
||||
..#............................#..............#...................#........................................#.............................#..
|
||||
............................................................................................................................................
|
||||
................#.....#..............#.......................................#.................#.....#......................................
|
||||
........#.............................................#..................................................................#..................
|
||||
..........................................#..................#..........#...............#.........................................#.........
|
||||
#................................................................................#.............................#..........................#.
|
||||
............................................................................................................................................
|
||||
............#...............................................................................................................................
|
||||
.......................#.....#.................#..........................#.........................................................#.......
|
||||
.................................................................................................#..........................................
|
||||
...................................#................#..................................#.............................#......................
|
||||
....#.....................................................#................................................#................#............#..
|
||||
..........#......................................................................#............#.............................................
|
||||
.....................................................................................................#............#..............#..........
|
||||
........................#.........................................#.....#...............................................#...................
|
||||
..#............................#............................................................................................................
|
||||
..............#.........................#...................#.....................................#......#..................................
|
||||
............................................................................#......#........................................................
|
||||
...........................................................................................................................#................
|
||||
...................#.................................................................................#..............#............#..........
|
||||
..........................#.......................#........................................#.............................................#..
|
||||
...................................................................#........................................................................
|
||||
#...............#.....................#.....#.....................................#.........................................................
|
||||
.................................#.........................................#...........................#....................................
|
||||
......#.........................................................................................#...........#..............#................
|
||||
..........................................................#............................................................................#....
|
||||
....................................................................................................................#..........#............
|
||||
.............#......#........................#..............................................................................................
|
||||
.......................................#............................#..................#....................................................
|
||||
.....................................................#..............................................#.......................................
|
||||
..#..........................#.................................................#...............#................#...........................
|
||||
.......#.......#............................................#.....................................................................#.........
|
||||
.........................................#.....#....................................................................#.....#.................
|
||||
.......................................................................................................#....................................
|
||||
....#...............................................#....................#.........#..............#.........................................
|
||||
.............................................................................................................#.......................#......
|
||||
.....................#........#.............................................................................................................
|
||||
............................................................#.....#.........................................................#...............
|
||||
.............#...............................#.........#.................................#.......................#..........................
|
||||
........................................................................#......#............................................................
|
||||
............................#..........................................................................................#...................#
|
||||
.#.......#..........#..................#.........................................................................................#..........
|
||||
................................#...........................................................................................................
|
||||
....................................................#...........#......................#........#...........................................
|
||||
......#.....#...............................................................................................................................
|
||||
.........................................................#.......................#......................#.............................#.....
|
||||
.........................................#.................................#.........................................#......................
|
||||
...............................................................................................................................#............
|
||||
.......................#......................................................................#.............................................
|
||||
#......#......................#...............#.....#..................#...................................................#................
|
||||
................................................................................#.............................#.............................
|
||||
..................#.......................#..........................................#..............#...............#............#........#.
|
||||
............................................................................................................................................
|
||||
..#.............................#..............................#............................................................................
|
||||
.............................................#............#............................................................#....................
|
||||
........................................................................................................................................#...
|
||||
......................................................................#..........................#.....#.....#..............................
|
||||
.............#.....#........................................................................................................................
|
||||
.....#...............................................#.....................................#.......................#........................
|
||||
...........................#....................................#..............................................................#............
|
||||
............................................................................................................................................
|
||||
............................................................................................................................................
|
||||
...................................#..........#..............#......#.................#..........................#........#...............#.
|
||||
..............#......................................................................................................................#......
|
||||
..........................#.............................................#......#............................................................
|
||||
.......#...........#.........................................................................#..............................................
|
||||
................................#.................#.................................................#.....#.............#...................
|
||||
.......................#................................#............................#......................................................
|
||||
............................................#....................#..................................................#.......................
|
||||
............................#.............................................................#....................#............................
|
||||
...........................................................................#................................................................
|
||||
.......#.....#.......................#.....................................................................#................................
|
||||
..#.........................................................................................................................................
|
||||
.....................#.........................................................#...............#............................................
|
||||
..........................................#..........#.......#........................#.....................................................
|
||||
................................#...................................#...............................#.....................#.....#...........
|
||||
............................................................................#...............#...............................................
|
||||
.............#.............#..........#...........................................#...............................#.........................
|
||||
...................................................................................................................................#.....#..
|
||||
.#.......#...............................................................................................#..................................
|
||||
.........................................#...............#............................#.......................#...............#.............
|
||||
...........................................................................#............................................#...................
|
||||
....................#..........#.............#.....................................................#........................................
|
||||
......#.....................................................................................................................................
|
||||
#...........................................................................................................................................
|
||||
....................................................................#.............#.....................#...........#.......................
|
||||
..........#......................................#.............#.............#..............................................................
|
||||
..........................#.............................#..................................#...................#...............#.........#..
|
||||
...................#........................................................................................................................
|
||||
...................................#..............................#.........................................................................
|
||||
#..............#.......................................................#.......#..................#........#................................
|
||||
........................................................................................................................#...................
|
||||
.......#.................#......#......................................................#.....................................#..............
|
||||
........................................................#.............................................#.....................................
|
||||
............................................................................#.....................................#.........................
|
||||
...............................................................#...................#........#......................................#........
|
||||
..................#...............................#..................#......................................#...............................
|
||||
.....................................#................................................................................#.....................
|
||||
............#.......................................................................................#.......................................
|
||||
...........................#..............................................................#............................................#....
|
||||
..........................................#................................#................................................................
|
||||
.............................................................#................................#.................................#...........
|
||||
.....................#..............#..............................................................................#........................
|
||||
..............................#.....................#.............#...................................#.....................................
|
||||
................#................................................................#.............................#..........#.................
|
||||
..........#............................................................................#..................#.................................
|
||||
...................................................................................................#...........................#.....#......
|
||||
............................................................................................................................................
|
||||
.....#..............................#.............#.................#.......................................................................
|
||||
.............................................#...............#...........#..........................................#.......................
|
||||
.......................#......#.........................#...................................................................#...............
|
||||
.#........................................................................................#............#............................#.......
|
||||
..................................#.............................................#................#............#.............................
|
||||
..........................#.........................#.......................................................................................
|
||||
.............#......#..........................#.....................................#....................#.................................
|
||||
............................................................#.............#.........................................#.......................
|
||||
...........................................#................................................................................................
|
||||
..........#..........................#...............................#...............................#............................#.........
|
||||
............................#..................................#.........................#................................................#.
|
||||
.............................................................................#...................#..........................................
|
||||
....#...............................................#.................................................................................#.....
|
||||
.................#.....#.......#...............#......................................#...........................#.........................
|
||||
....................................#......................................................#................................................
|
||||
........................................................#........#..............#......................................#....................
|
||||
#......#.....#........................................................................................#.....................#......#........
|
||||
...................................................#.........#..........#.......................................#...........................
|
||||
.........................................................................................#..................................................
|
||||
...............................................................................................................................#............
|
||||
................................................#..........................#....................#...........................................
|
||||
.........#.........................................................................#...................#....................................
|
||||
..........................#........................................#.........................................#.......#......................
|
||||
....................................................#...................................#...................................................
|
||||
............................................#.................#...................................#...........................#.............
|
||||
.....................#............#.........................................................................................................
|
||||
.......#....................................................................#...........................#.........................#......#..
|
||||
.......................................................#.......................................................#............................
|
157
day11/src/main.rs
Normal file
157
day11/src/main.rs
Normal file
@ -0,0 +1,157 @@
|
||||
use std::fs::read_to_string;
|
||||
use std::iter::zip;
|
||||
use std::time::Instant;
|
||||
|
||||
fn naive_implementation(input_str: &str) -> (i64, i64) {
|
||||
let width = input_str.lines().next().unwrap().len();
|
||||
let height = input_str.lines().count();
|
||||
// These arrays will hold mapping of initial coordinates to coordinates after expansion
|
||||
// In the initial loop the elements will be 1 for empty and 0 for non-empty
|
||||
let mut x_mapping: Vec<i64> = vec![1; width];
|
||||
let mut y_mapping: Vec<i64> = vec![1; height];
|
||||
// List of tuples of galaxy coordinates
|
||||
let mut galaxies: Vec::<(i64, i64)> = vec![];
|
||||
for (j, line) in input_str.lines().enumerate() {
|
||||
for (i, c) in line.bytes().enumerate() {
|
||||
if c == b'#' {
|
||||
x_mapping[i] = 0;
|
||||
y_mapping[j] = 0;
|
||||
galaxies.push((i as i64, j as i64));
|
||||
}
|
||||
}
|
||||
}
|
||||
// Convert mappings of 0 and 1 to accumulated coordinate mappings
|
||||
// mapping1 is for task 1, mapping2 is for task 2, mapping2 is a purely output argument
|
||||
let accumulate_mappings =
|
||||
|mapping1: &mut Vec<i64>, mapping2: &mut Vec<i64>| {
|
||||
let mut accmulator: i64 = 0;
|
||||
let mut accmulator2: i64 = 0;
|
||||
for (x1, x2) in zip(mapping1.iter_mut(), mapping2.iter_mut()) {
|
||||
accmulator += *x1;
|
||||
accmulator2 += *x1 * 999999;
|
||||
*x1 = accmulator;
|
||||
*x2 = accmulator2;
|
||||
accmulator += 1;
|
||||
accmulator2 += 1;
|
||||
}
|
||||
};
|
||||
// Convert galaxy coordinates using mapping arrays
|
||||
// Returns a copy becuase we need two different mappings for two tasks
|
||||
let map_galaxies =
|
||||
|galaxies: &Vec<(i64, i64)>, x_mapping: &Vec<i64>, y_mapping: &Vec<i64>| {
|
||||
galaxies.iter().map(|&(x, y)| (x_mapping[x as usize], y_mapping[y as usize])).collect::<Vec<_>>()
|
||||
};
|
||||
// Calculating the distances pairwise
|
||||
let sum_distances =
|
||||
|galaxies: &Vec<(i64, i64)>| {
|
||||
let mut sum1 = 0;
|
||||
for (i, &(x1, y1)) in galaxies.iter().enumerate() {
|
||||
for &(x2, y2) in galaxies[i + 1..].iter() {
|
||||
sum1 += (x2 - x1).abs() + (y2 - y1).abs();
|
||||
}
|
||||
}
|
||||
sum1
|
||||
};
|
||||
let mut x_mapping2: Vec<i64> = vec![0; width];
|
||||
let mut y_mapping2: Vec<i64> = vec![0; height];
|
||||
accumulate_mappings(&mut x_mapping, &mut x_mapping2);
|
||||
accumulate_mappings(&mut y_mapping, &mut y_mapping2);
|
||||
let galaxies_mapped1 = map_galaxies(&galaxies, &x_mapping, &y_mapping);
|
||||
let galaxies_mapped2 = map_galaxies(&galaxies, &x_mapping2, &y_mapping2);
|
||||
let sum1 = sum_distances(&galaxies_mapped1);
|
||||
let sum2 = sum_distances(&galaxies_mapped2);
|
||||
(sum1, sum2)
|
||||
}
|
||||
|
||||
fn improved_implementation(input_str: &str) -> (i64, i64) {
|
||||
let width = input_str.lines().next().unwrap().len();
|
||||
let height = input_str.lines().count();
|
||||
// These arrays will hold mapping of initial coordinates to coordinates after expansion
|
||||
// In the initial loop the elements will be 1 for empty and 0 for non-empty
|
||||
let mut x_mapping: Vec<i64> = vec![1; width];
|
||||
let mut y_mapping: Vec<i64> = vec![1; height];
|
||||
// These arrays hold a tupe of row/col index and count of galaxies in that index
|
||||
// They will be later mapped using mapping arrays
|
||||
let mut x_counters = (0..width)
|
||||
.map(|i| (i as i64, 0i64)).collect::<Vec<_>>();
|
||||
let mut y_counters = (0..height)
|
||||
.map(|i| (i as i64, 0i64)).collect::<Vec<_>>();
|
||||
for (j, line) in input_str.lines().enumerate() {
|
||||
for (i, c) in line.bytes().enumerate() {
|
||||
if c == b'#' {
|
||||
x_mapping[i] = 0;
|
||||
y_mapping[j] = 0;
|
||||
let (_, count_x) = &mut x_counters[i];
|
||||
*count_x += 1;
|
||||
let (_, count_y) = &mut y_counters[j];
|
||||
*count_y += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Remove empty rows/cols
|
||||
x_counters.retain(|(_, counter)| *counter > 0);
|
||||
y_counters.retain(|(_, counter)| *counter > 0);
|
||||
// Convert mappings of 0 and 1 to accumulated coordinate mappings
|
||||
// mapping1 is for task 1, mapping2 is for task 2, mapping2 is a purely output argument
|
||||
let accumulate_mappings =
|
||||
|mapping1: &mut Vec<i64>, mapping2: &mut Vec<i64>| {
|
||||
let mut accmulator: i64 = 0;
|
||||
let mut accmulator2: i64 = 0;
|
||||
for (x1, x2) in zip(mapping1.iter_mut(), mapping2.iter_mut()) {
|
||||
accmulator += *x1;
|
||||
accmulator2 += *x1 * 999999;
|
||||
*x1 = accmulator;
|
||||
*x2 = accmulator2;
|
||||
accmulator += 1;
|
||||
accmulator2 += 1;
|
||||
}
|
||||
};
|
||||
// Convert counter indices using mapping arrays
|
||||
// Returns a copy becuase we need two different mappings for two tasks
|
||||
let map_counter_coordinates =
|
||||
|counters: &Vec<(i64, i64)>, mapping: &Vec<i64>| {
|
||||
counters.iter().map(|&(i, counter)| (mapping[i as usize], counter)).collect::<Vec<_>>()
|
||||
};
|
||||
// Sum all distances along one dimension
|
||||
let sum_distances =
|
||||
|counters: &Vec<(i64, i64)>| {
|
||||
let mut sum1 = 0;
|
||||
for (i, &(pos1, counter1)) in counters.iter().enumerate() {
|
||||
for &(pos2, counter2) in counters[i + 1..].iter() {
|
||||
sum1 += (pos2 - pos1) * counter1 * counter2;
|
||||
}
|
||||
}
|
||||
sum1
|
||||
};
|
||||
let mut x_mapping2: Vec<i64> = vec![0; width];
|
||||
let mut y_mapping2: Vec<i64> = vec![0; height];
|
||||
accumulate_mappings(&mut x_mapping, &mut x_mapping2);
|
||||
accumulate_mappings(&mut y_mapping, &mut y_mapping2);
|
||||
let x_counters1 = map_counter_coordinates(&x_counters, &x_mapping);
|
||||
let y_counters1 = map_counter_coordinates(&y_counters, &y_mapping);
|
||||
let x_counters2 = map_counter_coordinates(&x_counters, &x_mapping2);
|
||||
let y_counters2 = map_counter_coordinates(&y_counters, &y_mapping2);
|
||||
let sum1 = sum_distances(&x_counters1) + sum_distances(&y_counters1);
|
||||
let sum2 = sum_distances(&x_counters2) + sum_distances(&y_counters2);
|
||||
(sum1, sum2)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let time_start = Instant::now();
|
||||
let input_str = read_to_string("input.txt").unwrap();
|
||||
let time_start_no_io = Instant::now();
|
||||
// Option to
|
||||
let mut sum1 = 0i64;
|
||||
let mut sum2 = 0i64;
|
||||
// Solve multiple times for performance testing
|
||||
for _ in 0..1000 {
|
||||
//(sum1, sum2) = naive_implementation(&input_str);
|
||||
(sum1, sum2) = improved_implementation(&input_str);
|
||||
}
|
||||
let elapsed = time_start.elapsed().as_micros();
|
||||
let elapsed_no_io = time_start_no_io.elapsed().as_micros();
|
||||
println!("Time: {}us", elapsed);
|
||||
println!("Time without file i/o: {}us", elapsed_no_io);
|
||||
println!("Sum1: {}", sum1);
|
||||
println!("Sum1: {}", sum2);
|
||||
}
|
Loading…
Reference in New Issue
Block a user