diff options
Diffstat (limited to '2023/day11.rs')
| -rw-r--r-- | 2023/day11.rs | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/2023/day11.rs b/2023/day11.rs new file mode 100644 index 0000000..f78f45d --- /dev/null +++ b/2023/day11.rs @@ -0,0 +1,96 @@ +#![allow(dead_code)] +#![allow(unused_variables)] +#![allow(unused_mut)] +use std::fs::File; +use std::io::Read; + +fn transpose<T>(original: Vec<Vec<T>>) -> Vec<Vec<T>> { + assert!(!original.is_empty()); + let mut transposed = (0..original[0].len()).map(|_| vec![]).collect::<Vec<_>>(); + + for original_row in original { + for (item, transposed_row) in original_row.into_iter().zip(&mut transposed) { + transposed_row.push(item); + } + } + transposed +} + +fn insert_rows(m: Vec<Vec<bool>>) -> Vec<Vec<bool>> { + let mut out = Vec::new(); + + for r in m { + if r.iter().any(|x| *x) { + out.push(r); + } else { + out.push(r.clone()); + out.push(r); + } + } + out +} + +fn print_m(m: &Vec<Vec<bool>>) { + for i in 0..m.len() { + for j in 0..m[0].len() { + if m[i][j] { + print!("#"); + } else { + print!("."); + } + } + println!(); + } + println!(); +} + +fn main() { + // let filename = "in/day11.ref"; + let filename = "in/day11.pzl"; + + let mut f = File::open(filename).expect("cannot open file"); + let mut content = String::new(); + f.read_to_string(&mut content).expect("cannot read file"); + let lines = content.trim_end().split('\n'); + + let mut m: Vec<Vec<bool>> = Vec::new(); + for line in lines { + let mut r: Vec<bool> = Vec::new(); + for c in line.chars() { + r.push(if c == '#' { true } else { false }); + } + m.push(r); + } + + m = insert_rows(m); + + m = transpose(m); + m = insert_rows(m); + m = transpose(m); + + let mut p: Vec<(i32, i32)> = Vec::new(); + for y in 0..m.len() { + for x in 0..m[0].len() { + if m[y][x] { + p.push((x as i32, y as i32)); + } + } + } + println!("{:?}", p); + + let mut res1 = 0; + let mut res2 = 0; + + for i in 0..p.len() { + for j in i..p.len() { + if i != j { + let (x1, y1) = p[i]; + let (x2, y2) = p[j]; + res1 += (x2 - x1).abs() + (y2 - y1).abs(); + } + } + } + + println!("res1: {}", res1); + println!("res2: {}", res2); +} |
