diff options
author | Santo Cariotti <santo@dcariotti.me> | 2024-02-09 11:42:04 +0100 |
---|---|---|
committer | Santo Cariotti <santo@dcariotti.me> | 2024-02-09 11:42:04 +0100 |
commit | db2686c798378738020a0951a521358586e21aa0 (patch) | |
tree | 8d585ceb9bdc302ae10a2458cc343be40d60acb7 /2023/rust/day1/src | |
parent | 67dff579e91c13ef40ecb17d14497d145861c5e7 (diff) |
Add day2 in OCaml
Diffstat (limited to '2023/rust/day1/src')
-rw-r--r-- | 2023/rust/day1/src/lib.rs | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/2023/rust/day1/src/lib.rs b/2023/rust/day1/src/lib.rs new file mode 100644 index 0000000..3240d6d --- /dev/null +++ b/2023/rust/day1/src/lib.rs @@ -0,0 +1,97 @@ +pub fn part1(input: &str) -> u32 { + let mut res: u32 = 0; + + for line in input.split('\n') { + let mut d1: i32 = -1; + let mut d2: i32 = -1; + for ch in line.chars() { + if ch.is_digit(10) { + if d1 == -1 { + d1 = ch.to_digit(10).unwrap() as i32 * 10; + } + + d2 = ch.to_digit(10).unwrap() as i32; + } + } + + if d1 + d2 > 0 { + res += (d1 + d2) as u32; + } + } + + res +} + +pub fn part2(input: &str) -> u32 { + let mut res: u32 = 0; + + let hs: [(&str, u32); 18] = [ + ("one", 1), + ("1", 1), + ("two", 2), + ("2", 2), + ("three", 3), + ("3", 3), + ("four", 4), + ("4", 4), + ("five", 5), + ("5", 5), + ("six", 6), + ("6", 6), + ("seven", 7), + ("7", 7), + ("eight", 8), + ("8", 8), + ("nine", 9), + ("9", 9), + ]; + + for (i, line) in input.strip_suffix('\n').unwrap().split('\n').enumerate() { + let mut idx: Vec<(i32, u32)> = vec![]; + for (k, v) in &hs { + let ms: Vec<_> = line.match_indices(k).collect(); + for m in ms.iter() { + idx.push((m.0 as i32, *v)); + } + } + + idx.sort_by(|a, b| a.0.cmp(&b.0)); + println!("{i} {}", idx[0].1 * 10 + idx[idx.len() - 1].1); + res += idx[0].1 * 10 + idx[idx.len() - 1].1; + } + + res +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn example_part1() { + let input = include_str!("../example.txt"); + let result = part1(input); + assert_eq!(result, 142); + } + + #[test] + fn input_part1() { + let input = include_str!("../input.txt"); + let result = part1(input); + assert_eq!(result, 54159); + } + + #[test] + fn example_part2() { + let input = include_str!("../example2.txt"); + let result = part2(input); + assert_eq!(result, 281); + } + + #[test] + fn input_part2() { + let input = include_str!("../input2.txt"); + let result = part2(input); + assert_eq!(result, 53866); + } +} |