Skip to content

Commit ee52c02

Browse files
committed
[2025] Solution for Day 5
1 parent c69a05a commit ee52c02

File tree

5 files changed

+115
-1
lines changed

5 files changed

+115
-1
lines changed

2025/src/bin/day05.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
use aoc2025::days::day05::{part1, part2};
2+
use std::env;
3+
use std::fs;
4+
use std::process;
5+
6+
fn main() {
7+
let args: Vec<String> = env::args().collect();
8+
if args.len() < 2 {
9+
println!("Missing required arguments");
10+
process::exit(1);
11+
}
12+
13+
let contents = fs::read_to_string(&args[1]).expect("Something went wrong");
14+
println!("Part 1: {}", part1(&contents));
15+
println!("Part 2: {}", part2(&contents));
16+
}

2025/src/days.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ pub mod day01;
22
pub mod day02;
33
pub mod day03;
44
pub mod day04;
5+
pub mod day05;

2025/src/days/day05.rs

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
pub fn part1(contents: &str) -> i64 {
2+
let (ranges, available) = parse_input(contents);
3+
let mut count = 0;
4+
for b in available {
5+
for r in &ranges {
6+
if b >= r.0 && b <= r.1 {
7+
count += 1;
8+
break;
9+
}
10+
}
11+
}
12+
count
13+
}
14+
15+
pub fn part2(contents: &str) -> i64 {
16+
let (mut ranges, _) = parse_input(contents);
17+
ranges.sort_by(|a, b| a.0.cmp(&b.0));
18+
let mut merged_ranges = Vec::new();
19+
let mut current_merged = ranges[0];
20+
for r in ranges.iter().skip(1) {
21+
if r.0 <= current_merged.1 {
22+
current_merged.1 = current_merged.1.max(r.1);
23+
} else {
24+
merged_ranges.push(current_merged);
25+
current_merged = r.clone();
26+
}
27+
}
28+
merged_ranges.push(current_merged);
29+
30+
let mut count = 0;
31+
for r in merged_ranges {
32+
count += r.1 - r.0 + 1;
33+
}
34+
count
35+
}
36+
37+
fn parse_input(contents: &str) -> (Vec<(i64, i64)>, Vec<i64>) {
38+
let lines = contents.lines();
39+
let mut ranges = Vec::new();
40+
let mut available = Vec::new();
41+
let mut found_blank = false;
42+
43+
for l in lines {
44+
if l.is_empty() {
45+
found_blank = true;
46+
continue;
47+
}
48+
49+
if !found_blank {
50+
let parts: Vec<&str> = l.split('-').collect();
51+
let start = parts[0].parse::<i64>().unwrap();
52+
let end = parts[1].parse::<i64>().unwrap();
53+
ranges.push((start, end));
54+
} else {
55+
let blocked_value = l.parse::<i64>().unwrap();
56+
available.push(blocked_value);
57+
}
58+
}
59+
60+
(ranges, available)
61+
}
62+
63+
#[cfg(test)]
64+
mod tests {
65+
use super::*;
66+
67+
#[test]
68+
fn test_part1() {
69+
let input = vec![
70+
"3-5", "10-14", "16-20", "12-18", "", "1", "5", "8", "11", "17", "32",
71+
];
72+
73+
assert_eq!(part1(&input.join("\n")), 3);
74+
}
75+
76+
#[test]
77+
fn test_part2() {
78+
let input = vec![
79+
"3-5", "10-14", "16-20", "12-18", "", "1", "5", "8", "11", "17", "32",
80+
];
81+
82+
assert_eq!(part2(&input.join("\n")), 14);
83+
}
84+
}

2025/tests/day05.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
use aoc2025::days::day05::{part1, part2};
2+
3+
#[test]
4+
fn test_part1() {
5+
let content = std::include_str!("../../private/inputs/2025/day05.txt");
6+
assert_eq!(part1(&content), 679);
7+
}
8+
9+
#[test]
10+
fn test_part2() {
11+
let content = std::include_str!("../../private/inputs/2025/day05.txt");
12+
assert_eq!(part2(&content), 358155203664116);
13+
}

private

0 commit comments

Comments
 (0)