81 lines
1.8 KiB
Rust
81 lines
1.8 KiB
Rust
|
use regex::Regex;
|
||
|
|
||
|
pub fn run() {
|
||
|
let input = include_str!("../input/day1.txt");
|
||
|
// let input = r#"1abc2
|
||
|
// pqr3stu8vwx
|
||
|
// a1b2c3d4e5f
|
||
|
// treb7uchet"#;
|
||
|
// let input = r#"two1nine
|
||
|
// eightwothree
|
||
|
// abcone2threexyz
|
||
|
// xtwone3four
|
||
|
// 4nineeightseven2
|
||
|
// zoneight234
|
||
|
// 7pqrstsixteen"#;
|
||
|
|
||
|
// let sum: u32 = input
|
||
|
// .lines()
|
||
|
// .filter(|s| !s.is_empty())
|
||
|
// .map(|s| find_digits(s))
|
||
|
// .sum();
|
||
|
// dbg!(sum);
|
||
|
|
||
|
dbg!(find_digits_part2("gdgj3f"));
|
||
|
|
||
|
let sum2 = input
|
||
|
.lines()
|
||
|
.filter(|s| !s.is_empty())
|
||
|
.map(|s| find_digits_part2(s))
|
||
|
.sum::<u32>();
|
||
|
dbg!(sum2);
|
||
|
}
|
||
|
|
||
|
fn find_digits(s: &str) -> u32 {
|
||
|
let first = s
|
||
|
.chars()
|
||
|
.nth(s.find(|c: char| c.is_ascii_digit()).unwrap())
|
||
|
.unwrap()
|
||
|
.to_digit(10)
|
||
|
.unwrap();
|
||
|
let last = s
|
||
|
.chars()
|
||
|
.nth(s.rfind(|c: char| c.is_ascii_digit()).unwrap())
|
||
|
.unwrap()
|
||
|
.to_digit(10)
|
||
|
.unwrap();
|
||
|
first * 10 + last
|
||
|
}
|
||
|
|
||
|
fn find_digits_part2(s: &str) -> u32 {
|
||
|
let re = Regex::new("^([1-9]|one|two|three|four|five|six|seven|eight|nine)").unwrap();
|
||
|
let mut s = s.to_owned();
|
||
|
let mut first: Option<u32> = None;
|
||
|
let mut last: Option<u32> = None;
|
||
|
while !s.is_empty() {
|
||
|
if let Some(m) = re.find(&s) {
|
||
|
last = Some(parse_digit(m.as_str()));
|
||
|
if first == None {
|
||
|
first = last;
|
||
|
}
|
||
|
}
|
||
|
s.remove(0);
|
||
|
}
|
||
|
return first.unwrap() * 10 + last.unwrap();
|
||
|
}
|
||
|
|
||
|
fn parse_digit(s: &str) -> u32 {
|
||
|
match s {
|
||
|
"one" => 1,
|
||
|
"two" => 2,
|
||
|
"three" => 3,
|
||
|
"four" => 4,
|
||
|
"five" => 5,
|
||
|
"six" => 6,
|
||
|
"seven" => 7,
|
||
|
"eight" => 8,
|
||
|
"nine" => 9,
|
||
|
_ => s.parse().unwrap(),
|
||
|
}
|
||
|
}
|