Skip to content

Commit c58e0b6

Browse files
committed
[2025] Day 5 draft
1 parent 0adeba6 commit c58e0b6

File tree

3 files changed

+120
-0
lines changed

3 files changed

+120
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Thank you to [Eric Wastl](http://was.tl) for running this incredible yearly even
99
- [Day 02: Gift Shop](aoc_2025/src/day_02.rs)
1010
- [Day 03: Lobby](aoc_2025/src/day_03.rs)
1111
- [Day 04: Printing Department](aoc_2025/src/day_04.rs)
12+
- [Day 05: Cafeteria](aoc_2025/src/day_05.rs)
1213
<!-- MARKER -->
1314

1415
## [2024](https://adventofcode.com/2024) [![aoc_2024](https://github.com/connorslade/advent-of-code/actions/workflows/aoc_2024.yml/badge.svg)](https://github.com/connorslade/advent-of-code/actions/workflows/aoc_2024.yml)

aoc_2025/src/day_05.rs

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
use std::ops::RangeInclusive;
2+
3+
use common::{Answer, solution};
4+
5+
solution!("Cafeteria", 5);
6+
7+
fn part_a(input: &str) -> Answer {
8+
let (ranges_raw, nums_raw) = input.split_once("\n\n").unwrap();
9+
let mut ranges = Vec::new();
10+
for range in ranges_raw.lines() {
11+
let (first, last) = range.split_once('-').unwrap();
12+
ranges.push(first.parse::<u64>().unwrap()..=last.parse::<u64>().unwrap());
13+
}
14+
15+
let mut out = 0;
16+
for num in nums_raw.lines() {
17+
let num = num.parse::<u64>().unwrap();
18+
if ranges.iter().any(|x| x.contains(&num)) {
19+
out += 1;
20+
continue;
21+
}
22+
}
23+
24+
out.into()
25+
}
26+
27+
#[derive(Default, Debug)]
28+
struct Ranges {
29+
inner: Vec<RangeInclusive<u64>>,
30+
}
31+
32+
fn range_intersects(a: &RangeInclusive<u64>, b: &RangeInclusive<u64>) -> bool {
33+
a.start() <= b.start() && a.end() >= b.start() || b.start() <= a.start() && b.end() >= a.start()
34+
}
35+
36+
impl Ranges {
37+
fn add(&mut self, new: RangeInclusive<u64>) {
38+
for i in 0..self.inner.len() {
39+
let range = &self.inner[i];
40+
if range_intersects(&range, &new) {
41+
let start = *range.start().min(new.start());
42+
let end = *range.end().max(new.end());
43+
let new = start..=end;
44+
45+
self.inner.remove(i);
46+
self.add(new);
47+
return;
48+
}
49+
}
50+
51+
self.inner.push(new);
52+
}
53+
54+
fn count(&self) -> u64 {
55+
let mut out = 0;
56+
for range in &self.inner {
57+
out += range.end() - range.start() + 1;
58+
}
59+
60+
out
61+
}
62+
}
63+
64+
fn part_b(input: &str) -> Answer {
65+
let (ranges_raw, _s) = input.split_once("\n\n").unwrap();
66+
let mut ranges = Ranges::default();
67+
68+
for range in ranges_raw.lines() {
69+
let (first, last) = range.split_once('-').unwrap();
70+
let range = first.parse::<u64>().unwrap()..=last.parse::<u64>().unwrap();
71+
ranges.add(range);
72+
}
73+
74+
dbg!(&ranges);
75+
76+
ranges.count().into()
77+
}
78+
79+
#[cfg(test)]
80+
mod test {
81+
use indoc::indoc;
82+
83+
const CASE: &str = indoc! {"
84+
3-5
85+
10-14
86+
16-20
87+
12-18
88+
89+
1
90+
5
91+
8
92+
11
93+
17
94+
32
95+
"};
96+
97+
// const CASE: &str = indoc! {"
98+
// 3-5
99+
// 2-7
100+
// 8-10
101+
// 2-9
102+
103+
// "};
104+
105+
#[test]
106+
fn part_a() {
107+
assert_eq!(super::part_a(CASE), 3.into());
108+
}
109+
110+
#[test]
111+
fn part_b() {
112+
assert_eq!(super::part_b(CASE), 14.into());
113+
}
114+
}
115+
116+
// not: 381374757320727
117+
// not: 346809913640090

aoc_2025/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ mod day_01;
44
mod day_02;
55
mod day_03;
66
mod day_04;
7+
mod day_05;
78
// [import_marker]
89

910
pub const SOLUTIONS: &[Solution] = &[
1011
day_01::SOLUTION,
1112
day_02::SOLUTION,
1213
day_03::SOLUTION,
1314
day_04::SOLUTION,
15+
day_05::SOLUTION,
1416
// [list_marker]
1517
];

0 commit comments

Comments
 (0)