#![allow(dead_code)] #![allow(unused_variables)] #![allow(unused_mut)] use std::fs::File; use std::io::Read; fn transpose(original: Vec>) -> Vec> { assert!(!original.is_empty()); let mut transposed = (0..original[0].len()).map(|_| vec![]).collect::>(); 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> { 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>) { 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::new(); for line in lines { let mut r: Vec = 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); }