diff --git a/2022/rust/src/solutions/day03.rs b/2022/rust/src/solutions/day03.rs index 1b6924f..d7bc1b0 100644 --- a/2022/rust/src/solutions/day03.rs +++ b/2022/rust/src/solutions/day03.rs @@ -1,3 +1,4 @@ +#![allow(dead_code)] use std::collections::HashSet; use crate::utils; @@ -7,22 +8,43 @@ pub fn run() -> () { println!("Day 1"); println!("Part 1: {}", solve1(&data)); - // println!("Part 2: {}", solve2(&data)); + println!("Part 2: {}", solve2(&data)); } fn solve1(data: &Vec<(HashSet, HashSet)>) -> i32 { data.iter() .map(|(left, right)| { - let char = *left.intersection(right).last().expect("Not found char") as i32; - char - if char < 97 { 38 } else { 96 } + convert_char(*left.intersection(right).next().unwrap()) }) .sum() } -fn solve2(data: &Vec>) -> i32 { - 2 +fn solve2(data: &Vec<(HashSet, HashSet)>) -> i32 { + data.iter() + .map(|(left, right)| left.union(right).cloned().collect()) + .collect::>>() + .chunks_exact(3) + .map(|chunks| { + let char = { + let mut iter = chunks.iter().cloned(); + iter.next() + .map(|set| { + iter.fold(set, |set1, set2| { + set1.intersection(&set2).cloned().collect() + }) + }) + .map(|x| *x.iter().next().unwrap()) + .unwrap() + }; + convert_char(char) + }) + .sum() } +fn convert_char(char: char) -> i32 { + let char = char as i32; + char - if char < 97 { 38 } else { 96 } +} fn parse_data(data: Vec) -> Vec<(HashSet, HashSet)> { data.iter() @@ -30,7 +52,7 @@ fn parse_data(data: Vec) -> Vec<(HashSet, HashSet)> { let length = str.len(); let left = &str[..length / 2]; let right = &str[length / 2..]; - (left.chars().into_iter().collect(),right.chars().into_iter().collect()) + (left.chars().into_iter().collect(), right.chars().into_iter().collect()) }) .collect() }