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}