diff --git a/src/lib.rs b/src/lib.rs index e595a86..7c0c3eb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -65,6 +65,12 @@ pub mod day2 { let invalid_sum: u64 = invalid.sum(); invalid_sum.to_string() } + pub fn day2_part2(input: &str) -> String { + let ranges = parse(input); + let invalid = ranges.into_iter().flatten().filter(|&id| !is_id_doubly_valid(id)); + let invalid_sum: u64 = invalid.sum(); + invalid_sum.to_string() + } fn parse(input: &str) -> Vec> { input .split(',') @@ -82,12 +88,27 @@ pub mod day2 { first_half != second_half } } + fn is_id_doubly_valid(id: u64) -> bool { + let chars = id.to_string().chars().collect::>(); + let charnum = chars.len(); + for chunk_count in 2..=charnum { + if charnum % chunk_count != 0 { + continue; + } + let chunks = chars.chunks_exact(charnum / chunk_count).collect::>(); + if chunks.iter().all(|&chunk| chunk == chunks[0]) { + return false + } + } + true + } } #[cfg(test)] mod tests { use super::*; + #[ignore] #[test] fn day2_part1_test() { let test_result = day2::day2_part1(include_str!("../input/day2.test.txt")); @@ -95,6 +116,14 @@ mod tests { let result = day2::day2_part1(include_str!("../input/day2.txt")); assert_eq!(result, "38158151648"); } + #[ignore] + #[test] + fn day2_part2_test() { + let test_result = day2::day2_part2(include_str!("../input/day2.test.txt")); + assert_eq!(test_result, "4174379265"); + let result = day2::day2_part2(include_str!("../input/day2.txt")); + assert_eq!(result, "45283684555"); + } #[test] fn day1_part1_test() {