---cargo --- static CONTENT: &'static str = include_str!("./inputs/05_1.txt"); fn main() { let mut ranges: Vec<_> = CONTENT.lines().map(|l| l.trim()).take_while(|l| !l.is_empty()).map(|r| { let (start, end) = r.split_once('-').unwrap(); let start = start.parse::().unwrap(); let end = end.parse::().unwrap(); start..=end }).collect(); loop { let result: Option<(usize, usize)> = ranges.iter().enumerate().find_map(|(idx, r)| { ranges.iter().enumerate().filter(|(o_idx, _)| idx != *o_idx).find_map(|(o_idx, other)| { r.contains(other.start()).then_some((idx, o_idx)) }) }); let (idx, o_idx) = match result { Some(r) => r, None => break, }; let first = ranges[idx].clone(); let second = ranges[o_idx].clone(); let new_range_start: usize = *first.start().min(second.start()); let new_range_end: usize = *first.end().max(second.end()); let new_range = new_range_start..=new_range_end; println!("Merge\n{:?} +\n{:?} =\n{:?}", first, second, new_range); ranges[idx] = new_range; ranges.remove(o_idx); } ranges.sort_by_key(|v| (*v.start(), *v.end())); println!("Ranges: \n{:#?}", ranges); let result: usize = ranges.iter().map(|r| r.clone().count()).sum(); println!("Result: {:?}", result); }