oh no
use std::path::PathBuf;
fn first_number(line: impl Iterator<Item = char>) -> char {
for char in line {
if char.is_ascii_digit() {
return char;
}
}
return 'c';
}
pub fn task1(file: &PathBuf) {
let list = std::fs::read_to_string(file).unwrap();
let list = list.split("\n");
let list = list
.into_iter()
.filter(|line| line.chars().count() > 0)
.map(|line| {
line.chars()
.into_iter()
.filter(|digit| digit.is_ascii_digit())
})
.map(|line| (first_number(line.clone()), first_number(line.rev())))
.map(|chars| {
let number: u64 = format!("{}{}", chars.0, chars.1).parse().unwrap();
number
})
.collect::<Vec<u64>>();
let mut result = 0;
for number in list {
result += number;
}
println!("{result}")
}
pub fn task2(file: &PathBuf) {
let list = std::fs::read_to_string(file).unwrap();
let list = list.split("\n");
let list = list
.into_iter()
.filter(|line| line.chars().count() > 0)
.map(|line| {
let line = line
.replace("one", "o1e")
.replace("two", "t2o")
.replace("three", "t3e")
.replace("five", "f5e")
.replace("six", "s6x")
.replace("seven", "s7n")
.replace("eight", "e8t")
.replace("nine", "n9e");
let line = line
.replace("one", "1")
.replace("two", "2")
.replace("three", "3")
.replace("four", "4")
.replace("five", "5")
.replace("six", "6")
.replace("seven", "7")
.replace("eight", "8")
.replace("nine", "9");
line
})
.map(|line| {
line.chars()
.into_iter()
.filter(|digit| digit.is_ascii_digit())
.collect::<Vec<_>>()
})
.map(|line| {
(
first_number(line.clone().into_iter()),
first_number(line.into_iter().rev()),
)
})
.map(|chars| {
let number: u64 = format!("{}{}", chars.0, chars.1).parse().unwrap();
number
})
.collect::<Vec<u64>>();
let mut result = 0;
for number in list {
result += number;
}
println!("{result}")
}