use std::fs::read_to_string; fn main() { let invalid_sum: u64 = read_to_string("../input.txt") .expect("failed to open input file") .split(',') .flat_map(|range| { let (first_id, last_id) = range.split_once('-').expect("failed to parse range"); let (first_id, last_id): (u64, u64) = ( first_id.parse().expect("failed to parse first ID"), last_id.trim_end().parse().expect("failed to parse last ID"), ); first_id..=last_id }) .filter(|id| { let id = id.to_string(); let digit_count = id.len(); (1..=(digit_count / 2)) .any(|pattern_len| id[0..pattern_len].repeat(digit_count / pattern_len) == id) }) .sum(); println!("The sum of all invalid IDs is {invalid_sum}!") }