From d8e5908367a9bf54f086405941bba90f3e3929c7 Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Sat, 3 Dec 2022 19:31:33 +0100 Subject: day3 --- src/bin/day3.rs | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/bin/day3.rs (limited to 'src') diff --git a/src/bin/day3.rs b/src/bin/day3.rs new file mode 100644 index 0000000..3cc961d --- /dev/null +++ b/src/bin/day3.rs @@ -0,0 +1,70 @@ +use std::collections::HashSet; + +static DAY: u8 = 3; + +fn main() { + let input = advent::read_lines(DAY); + println!("{DAY}a: {}", sum_priorities(&input)); + println!("{DAY}b: {}", sum_badge_priorities(&input)); +} + +fn item_value(item: char) -> u32 { + if item.is_ascii_lowercase() { + item.to_digit(36).unwrap() - 9 + } else if item.is_ascii_uppercase() { + item.to_digit(36).unwrap() + 17 + } else { + panic!("unexpected common character: {}", item); + } +} + +fn sum_priorities(input: &[String]) -> u32 { + let mut priorities = 0; + + for line in input { + let (first, second) = line.split_at(line.len() / 2); + let first = first.chars().collect::>(); + let second = second.chars().collect::>(); + let common = first.intersection(&second).copied().collect::>(); + assert_eq!(common.len(), 1); + priorities += item_value(*common.first().unwrap()); + } + + priorities +} + +fn sum_badge_priorities(input: &[String]) -> u32 { + let mut priorities = 0; + + for group in input.chunks(3) { + let first = group[0].chars().collect::>(); + let second = group[1].chars().collect::>(); + let third = group[2].chars().collect::>(); + let common = first.intersection(&second).copied().collect::>(); + let common = common.intersection(&third).copied().collect::>(); + assert_eq!(common.len(), 1); + priorities += item_value(*common.first().unwrap()); + } + + priorities +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test() { + let input = [ + "vJrwpWtwJgWrhcsFMMfFFhFp".to_string(), + "jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL".to_string(), + "PmmdzqPrVvPwwTWBwg".to_string(), + "wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn".to_string(), + "ttgJtRGJQctTZtZT".to_string(), + "CrZsJsPPZsGzwwsLwLmpwMDw".to_string(), + ]; + + assert_eq!(sum_priorities(&input), 157); + assert_eq!(sum_badge_priorities(&input), 70); + } +} -- cgit v1.2.3