:)

day2 part2

+29
+29
src/lib.rs
··· 65 65 let invalid_sum: u64 = invalid.sum(); 66 66 invalid_sum.to_string() 67 67 } 68 + pub fn day2_part2(input: &str) -> String { 69 + let ranges = parse(input); 70 + let invalid = ranges.into_iter().flatten().filter(|&id| !is_id_doubly_valid(id)); 71 + let invalid_sum: u64 = invalid.sum(); 72 + invalid_sum.to_string() 73 + } 68 74 fn parse(input: &str) -> Vec<RangeInclusive<u64>> { 69 75 input 70 76 .split(',') ··· 82 88 first_half != second_half 83 89 } 84 90 } 91 + fn is_id_doubly_valid(id: u64) -> bool { 92 + let chars = id.to_string().chars().collect::<Vec<char>>(); 93 + let charnum = chars.len(); 94 + for chunk_count in 2..=charnum { 95 + if charnum % chunk_count != 0 { 96 + continue; 97 + } 98 + let chunks = chars.chunks_exact(charnum / chunk_count).collect::<Vec<_>>(); 99 + if chunks.iter().all(|&chunk| chunk == chunks[0]) { 100 + return false 101 + } 102 + } 103 + true 104 + } 85 105 } 86 106 87 107 #[cfg(test)] 88 108 mod tests { 89 109 use super::*; 90 110 111 + #[ignore] 91 112 #[test] 92 113 fn day2_part1_test() { 93 114 let test_result = day2::day2_part1(include_str!("../input/day2.test.txt")); 94 115 assert_eq!(test_result, "1227775554"); 95 116 let result = day2::day2_part1(include_str!("../input/day2.txt")); 96 117 assert_eq!(result, "38158151648"); 118 + } 119 + #[ignore] 120 + #[test] 121 + fn day2_part2_test() { 122 + let test_result = day2::day2_part2(include_str!("../input/day2.test.txt")); 123 + assert_eq!(test_result, "4174379265"); 124 + let result = day2::day2_part2(include_str!("../input/day2.txt")); 125 + assert_eq!(result, "45283684555"); 97 126 } 98 127 99 128 #[test]