use std::collections::HashSet; fn main() { // Use command line arguments to specify the input filename. let args: Vec = std::env::args().collect(); if args.len() < 2 { panic!("Usage: ./main \nNo input file provided. Exiting."); } // Next, read the contents of the input file into a string for easier processing. let input = std::fs::read_to_string(&args[1]).expect("Error opening file"); // Line-by-line processing is easiest. let input = input.lines(); // --- TASK BEGIN --- let mut count = 0; for line in input { // Turn "1-2,3-6" into ["1-2", "3-6"]. let ranges = line.split(',').collect::>(); // Turn ["1-2", "3-6"] into [["1", "2"], ["3", "6"]] let ranges = ranges .iter() .map(|x| x.split('-').collect::>()) .collect::>(); // Turn [["1", "2"], ["3", "6"]] into [1..=2, 3..=6] let ranges = ranges .iter() .map(|x| (x[0].parse::().unwrap())..=(x[1].parse::().unwrap())) .collect::>(); // Now turn the ranges into HashSets containing the respective integers. Essentially: // Turn [1..=2, 3..=6] into [{1,2}, {3,4,5,6}] let sets = ranges .into_iter() .map(|x| x.collect::>()) .collect::>(); // Check if either of the sets is a subset of the other, i.e. is fully contained in the other. // If so, add it to the count. if sets[0].is_subset(&sets[1]) || sets[1].is_subset(&sets[0]) { count += 1; } } println!("Count: {}", count); }