my solutions to advent of code
aoc advent-of-code
1use std::{ 2 cmp::Ordering::{Equal as Eq, Greater as Gt, Less as Lt}, 3 collections::HashSet, 4}; 5 6fn main() { 7 let input = include_str!("../../input.txt").trim(); 8 let (fresh_ranges, available) = input.split_once("\n\n").unwrap(); 9 let fresh_ranges: Vec<(u64, u64)> = fresh_ranges 10 .split("\n") 11 .map(|i| { 12 let (a, b) = i.split_once("-").unwrap(); 13 (a.parse().unwrap(), b.parse().unwrap()) 14 }) 15 .collect(); 16 let available = available.split("\n").map(|i| { 17 let i: u64 = i.parse().unwrap(); 18 i 19 }); 20 21 let part_1 = available.fold(0, |acc, i| { 22 acc + fresh_ranges 23 .iter() 24 .any(|(start, end)| &i >= start && &i <= end) as u64 25 }); 26 println!("Part 1: {}", part_1); 27 28 let mut seen_ranges: HashSet<(u64, u64)> = 29 HashSet::with_capacity(fresh_ranges.len()); 30 fresh_ranges.iter().for_each(|range| { 31 let range = seen_ranges.clone().iter().try_fold( 32 *range, 33 |range: (u64, u64), seen_range: &(u64, u64)| { 34 // btw im refusing to ever do something better than this idc about your sorting and whatever this is the way shut the fuck up i spent three hours on this i will be using it 35 match ( 36 range.0.cmp(&seen_range.0), 37 range.1.cmp(&seen_range.1), 38 range.0.cmp(&seen_range.1), 39 range.1.cmp(&seen_range.0), 40 ) { 41 // if there's no touching 42 (Gt, Gt, Gt, Gt) | (Lt, Lt, Lt, Lt) => Some(range), 43 // if it's inside of the other one 44 (Gt, Lt, _, _) 45 | (Eq, Lt, _, _) 46 | (Gt, Eq, _, _) 47 | (Eq, Eq, _, _) => None, 48 // if the other one is inside it 49 (Lt, Gt, _, _) | (Eq, Gt, _, _) | (Lt, Eq, _, _) => { 50 seen_ranges.remove(seen_range); 51 Some(range) 52 } 53 // if it's touching on the left side make them touch 54 (Lt, Lt, _, _) => { 55 seen_ranges.remove(seen_range); 56 Some((range.0, seen_range.1)) 57 } 58 // if it's touching on the right size make them touch 59 (Gt, Gt, _, _) => { 60 seen_ranges.remove(seen_range); 61 Some((seen_range.0, range.1)) 62 } 63 } 64 }, 65 ); 66 67 if range.is_some() { 68 seen_ranges.insert(range.unwrap()); 69 } 70 }); 71 let part_2 = seen_ranges 72 .into_iter() 73 .fold(0, |acc, range| acc + range.1 - range.0 + 1); 74 println!("Part 2: {}", part_2); 75}