257 lines
12 KiB
Rust
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);
|
|
}
|