diff options
Diffstat (limited to '11/src/part-1.rs')
-rw-r--r-- | 11/src/part-1.rs | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/11/src/part-1.rs b/11/src/part-1.rs new file mode 100644 index 0000000..075da3e --- /dev/null +++ b/11/src/part-1.rs @@ -0,0 +1,44 @@ +mod stuff; + +use crate::stuff::{is_galaxy, read_helper, cumulative_sum_expansion, distance, Position}; + + +fn main() { + let mut stdin = std::io::stdin().lock(); + + let mut buf: Vec<u8> = Vec::new(); + + let mut galaxies: Vec<Position> = Vec::new(); + + let num_bytes = read_helper(&mut stdin, &mut buf, b'\n').expect("IO error"); + if num_bytes == 0 { panic!("Malformed input"); } + let mut col_empty_mask: Vec<bool> = Vec::from_iter(std::iter::repeat(true).take(buf.len())); + let mut row_empty_mask: Vec<bool> = Vec::new(); + loop { + let mut row_empty: bool = true; + let i = row_empty_mask.len(); + for (j, & c) in (& buf).into_iter().enumerate() { + if is_galaxy(c) { + col_empty_mask[j] = false; + row_empty = false; + galaxies.push([i, j]); + } + } + row_empty_mask.push(row_empty); + + let num_bytes = read_helper(&mut stdin, &mut buf, b'\n').expect("IO error"); + if num_bytes == 0 { break; } + } + + let cumulative_row_sum: Vec<usize> = cumulative_sum_expansion(& row_empty_mask, 2); + let cumulative_col_sum: Vec<usize> = cumulative_sum_expansion(& col_empty_mask, 2); + + let mut res: usize = 0; + for (i, pos_1) in (& galaxies).into_iter().enumerate() { + for (_, pos_2) in (& galaxies).into_iter().enumerate().skip(i) { + res += distance(& cumulative_row_sum, & cumulative_col_sum, pos_1, pos_2); + } + } + + println!("{}", res); +} |