use std::{fs, collections::HashMap}; fn main() { let file_path = "input/03input.txt"; let contents = fs::read_to_string(file_path).expect("should read file"); let lines_count = contents.clone().lines().count(); let mut lines = contents.lines(); let first_line: Vec = lines.next().unwrap().chars().collect(); let mut matrix: Vec> = Vec::new(); matrix.push(first_line); loop { match lines.next() { Some(line) => { matrix.push(line.chars().collect()); }, None => break } } let mut total_val = 0; for i in 0..lines_count { for j in 0..matrix.get(i).unwrap().len() { let mut values = Vec::new(); if matrix.get(i).unwrap().get(j).unwrap() == &'*' { let mut locations = HashMap::new(); for k in i-1..i+2 { for l in j-1..j+2 { if k < lines_count && l <= matrix.get(k).unwrap().len() && (k != i || l != j) { locations.insert((k+2-i)*3+(l+2-j)-4, matrix.get(k).unwrap().get(l).unwrap().is_ascii_digit()); } } } println!("{} {} {:?}", i, j, locations); /* * 012 * 3*5 * 678 */ if i > 0 && j > 0 && *locations.get(&0).unwrap() { if j < matrix.get(i-1).unwrap().len()-1 && *locations.get(&2).unwrap() && *locations.get(&1).unwrap() { // 012 let mut value = 0; for k in 0..matrix.get(i-1).unwrap().len() { if matrix.get(i-1).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i-1).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else if k < j+1 { value = 0; } else { break; } } values.push(value); } else if j < matrix.get(i-1).unwrap().len()-1 && *locations.get(&2).unwrap() && !*locations.get(&1).unwrap() { // 0.2 { let mut value = 0; for k in 0..j { if matrix.get(i-1).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i-1).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else if k < j { value = 0; } } values.push(value); } { let mut value = 0; for k in j+1..matrix.get(i-1).unwrap().len() { if matrix.get(i-1).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i-1).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else { break; } } values.push(value); } } else if *locations.get(&1).unwrap() { // 01. let mut value = 0; for k in 0..j+1 { if matrix.get(i-1).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i-1).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else if k < j+1 { value = 0; } else { break; } } values.push(value); } else { // 0.. let mut value = 0; for k in 0..j { if matrix.get(i-1).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i-1).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else if k < j { value = 0; } else { break; } } values.push(value); } } else if i > 0 && *locations.get(&1).unwrap() { if (j < matrix.get(i-1).unwrap().len()-1 && !*locations.get(&2).unwrap()) || j == matrix.get(i-1).unwrap().len()-1 { // .1. values.push(matrix.get(i-1).unwrap().get(j).unwrap().to_digit(10).unwrap()); } else { // .12 let mut value = 0; for k in j..matrix.get(i-1).unwrap().len() { if matrix.get(i-1).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i-1).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else { break; } } values.push(value); } } else if i < lines_count-1 && *locations.get(&2).unwrap() { // ..2 let mut value = 0; for k in j+1..matrix.get(i-1).unwrap().len() { if matrix.get(i-1).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i-1).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else { break; } } values.push(value); } if j > 0 && *locations.get(&3).unwrap() { // 3* let mut value = 0; for k in 0..j { if matrix.get(i).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else if k < j-1 { value = 0; } } values.push(value); } if j < matrix.get(i).unwrap().len()-1 && *locations.get(&5).unwrap() { // *5 let mut value = 0; for k in j+1..matrix.get(i).unwrap().len() { if matrix.get(i).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else { break; } } values.push(value); } if i < lines_count-1 && j > 0 && *locations.get(&6).unwrap() { if j < matrix.get(i+1).unwrap().len()-1 && *locations.get(&8).unwrap() && *locations.get(&7).unwrap() { // 678 let mut value = 0; for k in 0..matrix.get(i+1).unwrap().len() { if matrix.get(i+1).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i+1).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else if k < j+1 { value = 0; } else { break; } } values.push(value); } else if j < matrix.get(i+1).unwrap().len()-1 && *locations.get(&8).unwrap() && !*locations.get(&7).unwrap() { // 6.8 { let mut value = 0; for k in 0..j { if matrix.get(i+1).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i+1).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else if k < j { value = 0; } } values.push(value); } { let mut value = 0; for k in j+1..matrix.get(i+1).unwrap().len() { if matrix.get(i+1).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i+1).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else { break; } } values.push(value); } } else if *locations.get(&7).unwrap() { // 67. let mut value = 0; for k in 0..j+1 { if matrix.get(i+1).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i+1).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else if k < j+1 { value = 0; } else { break; } } values.push(value); } else { // 6.. let mut value = 0; for k in 0..j { if matrix.get(i+1).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i+1).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else if k < j { value = 0; } else { break; } } values.push(value); } } else if i < lines_count - 1 && *locations.get(&7).unwrap() { if (j < matrix.get(i+1).unwrap().len()-1 && !*locations.get(&8).unwrap()) || j == matrix.get(i+1).unwrap().len()-1 { // .7. values.push(matrix.get(i+1).unwrap().get(j).unwrap().to_digit(10).unwrap()); } else { // .78 let mut value = 0; for k in j..matrix.get(i+1).unwrap().len() { if matrix.get(i+1).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i+1).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else { break; } } values.push(value); } } else if i < lines_count-1 && *locations.get(&8).unwrap() { // ..8 let mut value = 0; for k in j+1..matrix.get(i+1).unwrap().len() { if matrix.get(i+1).unwrap().get(k).unwrap().is_ascii_digit() { value = value * 10 + matrix.get(i+1).unwrap().get(k).unwrap().to_digit(10).unwrap(); } else { break; } } values.push(value); } println!("{:?}", values); if values.len() == 2 { total_val += values.into_iter().fold(1, |acc, x| acc * x); } } } } println!("{}", total_val); }