Skip to content

Commit 18a5f2b

Browse files
committed
solve: day5
1 parent 546bd17 commit 18a5f2b

File tree

4 files changed

+84
-2
lines changed

4 files changed

+84
-2
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
resolver = "2"
33
members = [
44
"aoc_lib/aoc_derive",
5-
"aoc_lib/utils", "day1", "day2", "day3", "day4",
5+
"aoc_lib/utils", "day1", "day2", "day3", "day4", "day5",
66
]
77

88
[workspace.dependencies]

aoc_lib

day5/Cargo.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "day5"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]
7+
aoc_derive.path = '../aoc_lib/aoc_derive'
8+
utils.path = '../aoc_lib/utils'
9+
derive_more.workspace = true
10+
itertools.workspace = true
11+
lazy-regex.workspace = true
12+
parse-display.workspace = true
13+
rayon.workspace = true
14+
regex.workspace = true
15+
num.workspace = true
16+
17+
[dev-dependencies]
18+
pretty_assertions.workspace = true

day5/src/main.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
use std::ops::RangeInclusive;
2+
3+
use aoc_derive::aoc_main;
4+
use itertools::Itertools;
5+
use utils::*;
6+
7+
fn part2(mut ranges: Vec<RangeInclusive<usize>>) -> usize {
8+
ranges.sort_by_key(|r| *r.start());
9+
loop {
10+
let prev = ranges.len();
11+
let mut i = 0;
12+
while i < ranges.len() - 1 {
13+
if ranges[i].end() >= ranges[i + 1].start() {
14+
ranges[i] = *ranges[i].start()..=(*ranges[i + 1].end().max(ranges[i].end()));
15+
ranges.remove(i + 1);
16+
} else {
17+
i += 1;
18+
}
19+
}
20+
21+
if ranges.len() == prev {
22+
return ranges.iter().map(|range| range.try_len().unwrap()).sum();
23+
}
24+
}
25+
}
26+
27+
#[aoc_main]
28+
fn solve(input: Input) -> impl Into<Solution> {
29+
let (ranges, ingredients) = input.raw.split_once("\n\n").unwrap();
30+
let ranges = ranges
31+
.lines()
32+
.map(|line| {
33+
let (start, end) = line.split('-').collect_tuple().unwrap();
34+
start.parse_usize()..=end.parse_usize()
35+
})
36+
.collect_vec();
37+
let ingredients = ingredients.lines().map(|line| line.parse::<usize>().unwrap()).collect_vec();
38+
39+
(ingredients.iter().filter(|i| ranges.iter().any(|r| r.contains(i))).count(), part2(ranges))
40+
}
41+
42+
#[cfg(test)]
43+
mod tests {
44+
use super::*;
45+
#[test]
46+
fn test_examples() {
47+
use utils::assert_example;
48+
assert_example!(
49+
r#"3-5
50+
10-14
51+
16-20
52+
12-18
53+
54+
1
55+
5
56+
8
57+
11
58+
17
59+
32"#,
60+
3,
61+
14
62+
);
63+
}
64+
}

0 commit comments

Comments
 (0)