2023-advent-of-code/src/03part2.rs

257 lines
12 KiB
Rust

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<char> = lines.next().unwrap().chars().collect();
let mut matrix: Vec<Vec<char>> = 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);
}