diff options
author | curly <curly@infernal.garden> | 2023-12-06 11:26:18 -0700 |
---|---|---|
committer | curly <curly@infernal.garden> | 2023-12-06 11:26:18 -0700 |
commit | 5d66cec6c41a62dacd9ac232808bfac526f76500 (patch) | |
tree | 32806921b553a89ca28957135a67a573a7a95210 /src/main.rs | |
download | aoc23-01-master.tar.gz aoc23-01-master.tar.bz2 aoc23-01-master.zip |
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..f7896a5 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,129 @@ +use std::fs; + +fn main() { + let f = fs::read_to_string("input2").unwrap(); + let mut nums_vec: Vec<u32> = vec![]; + + // part one + for line in f.lines() { + let mut first = 0; + let mut second = 0; + + // part two + // convert words to numbers + let nline = replace(line); + // println!("replaced:{}", nline); + + // Read first int + for c in nline.chars() { + first = get_num(&c); + if first != 0 { + break + } + } + + // Read the second int + let chars = nline.chars().rev(); + for c in chars { + second = get_num(&c); + if second != 0 { + break + } + } + + if first == 0 || second == 0 { + println!("{}:{}", first, second); + panic!(); + } + + let num = (first * 10) + second; + // println!("result:{}\n", num); + nums_vec.push(num); + } + + // println!("{:?}", nums_vec); + + let mut final_num = 0; + for num in nums_vec { + final_num += num + } + + println!("{}", final_num); +} + +fn replace(s: &str) -> String { + let wordmap: Vec<(&str, &str)> = vec![ + ("one", "1"), + ("two", "2"), + ("three", "3"), + ("four", "4"), + ("five", "5"), + ("six", "6"), + ("seven", "7"), + ("eight", "8"), + ("nine", "9") + ]; + + // println!("{}", s); + let mut s = s.to_string().clone(); + + //first + let mut nstring = "".to_string(); + let mut len = 0; + for _ in s.chars() { + len += 1; + } + + 'main: for cidx in 0..len { + let temp = s.split_at(cidx); + + // skip if a number is first + for c in temp.0.chars() { + if get_num(&c) > 0 { + break 'main + } + } + + for word in &wordmap { + let replace = temp.0.replace(word.0, word.1); + + if replace != temp.0 { + nstring = replace.to_string() + temp.1; + break 'main; + } + } + nstring = s.clone(); + } + s = nstring.clone(); + + // println!("{}", s); + + //second + let mut len = 0; + for _ in s.chars() { + len += 1; + } + + 'main: for cidx in (0..len).rev() { + let temp = s.split_at(cidx); + + for word in &wordmap { + let replace = temp.1.replace(word.0, word.1); + + if replace != temp.1 { + nstring = temp.0.to_string() + &replace; + break 'main; + } + } + nstring = s.clone(); + } + + nstring +} + +fn get_num(c: &char) -> u32 { + match c.to_digit(10) { + Some(n) => n, + None => 0, + } +} |