summaryrefslogtreecommitdiff
path: root/11/src/part-1.rs
diff options
context:
space:
mode:
Diffstat (limited to '11/src/part-1.rs')
-rw-r--r--11/src/part-1.rs44
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);
+}