Skip to content

Commit b1723ea

Browse files
committed
chore: y2025::day_05
1 parent 73fdb88 commit b1723ea

File tree

1 file changed

+60
-2
lines changed

1 file changed

+60
-2
lines changed
Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,65 @@
1+
use std::cmp::{max, min};
2+
use std::ops::RangeInclusive;
3+
use std::str::FromStr;
4+
5+
use aoclp::solvers_impl::input::safe_get_input_as_many_vecs_of_two_types;
6+
use itertools::Itertools;
7+
18
pub fn part_1() -> usize {
2-
0
9+
let (fresh_ids, available_ids) = input();
10+
available_ids
11+
.into_iter()
12+
.filter(|&id| fresh_ids.iter().any(|r| r.0.contains(&id)))
13+
.count()
314
}
415

516
pub fn part_2() -> usize {
6-
0
17+
let (fresh_ids, _) = input();
18+
fresh_ids
19+
.into_iter()
20+
.map(|r| r.0)
21+
.sorted_by(|a, b| a.start().cmp(b.start()).then(a.end().cmp(b.end())))
22+
.fold(Vec::new(), |mut acc, r| {
23+
match acc.last() {
24+
None => acc.push(r),
25+
Some(prev) if prev.end() < r.start() => acc.push(r),
26+
Some(prev) => {
27+
let from = *min(prev.start(), r.start());
28+
let to = *max(prev.end(), r.end());
29+
acc.pop();
30+
acc.push(from..=to);
31+
},
32+
}
33+
34+
acc
35+
})
36+
.into_iter()
37+
.map(|r| r.count())
38+
.sum()
39+
}
40+
41+
#[derive(Debug, Clone)]
42+
struct IdRange(RangeInclusive<usize>);
43+
44+
impl FromStr for IdRange {
45+
type Err = aoclp::Error;
46+
47+
fn from_str(s: &str) -> Result<Self, Self::Err> {
48+
let (from, to) = s.split('-').collect_tuple().unwrap();
49+
Ok(Self(from.parse()?..=to.parse()?))
50+
}
51+
}
52+
53+
fn input() -> (Vec<IdRange>, Vec<usize>) {
54+
let (fresh_ids, available_ids) = safe_get_input_as_many_vecs_of_two_types(2025, 5);
55+
(
56+
fresh_ids
57+
.into_iter()
58+
.map(|v| v.into_iter().next().unwrap())
59+
.collect_vec(),
60+
available_ids
61+
.into_iter()
62+
.map(|v| v.into_iter().next().unwrap())
63+
.collect_vec(),
64+
)
765
}

0 commit comments

Comments
 (0)