use super::Day; use crate::day; fn invalid_id(n: &i64) -> bool { let s = n.to_string(); s.len() % 2 == 0 && s[..s.len() / 2] == s[s.len() / 2..] } fn new_invalid_id(n: &i64) -> bool { let s = n.to_string(); let b = s.as_bytes(); (1..s.len()) .rev() .filter(|&d| s.len() % d == 0) .any(|d| b.chunks(d).all(|c| c == &b[..d])) } day!(Day2, 2, Vec<(i64, i64)>); impl Day for Day2 { type Parsed = Vec<(i64, i64)>; fn parse(input: &'static str) -> Self::Parsed { input .split(',') .map(|range| { let (n1, n2) = range.split_once('-').unwrap(); let (n1, n2) = (n1.parse::().unwrap(), n2.parse::().unwrap()); (n1, n2) }) .collect() } // 19386344315 fn part1(&self) -> i64 { self.data.iter().fold(0, |acc, (n1, n2)| { (*n1..=*n2).filter(|x| invalid_id(x)).sum::() + acc }) } // 34421651192 fn part2(&self) -> i64 { self.data.iter().fold(0, |acc, (n1, n2)| { (*n1..=*n2).filter(|x| new_invalid_id(x)).sum::() + acc }) } }