day 5 part 2
This commit is contained in:
@@ -1 +1,2 @@
|
|||||||
pub mod part1;
|
pub mod part1;
|
||||||
|
pub mod part2;
|
||||||
|
|||||||
53
src/day5/part2.rs
Normal file
53
src/day5/part2.rs
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
use std::{fs, ops::RangeInclusive};
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub fn solve() {
|
||||||
|
let file = fs::read_to_string("src/day5/input.txt").expect("You didn't provide input.txt.");
|
||||||
|
|
||||||
|
let mut original_ranges = Vec::<RangeInclusive<usize>>::new();
|
||||||
|
let mut fresh_products_ranges = Vec::<RangeInclusive<usize>>::new();
|
||||||
|
|
||||||
|
// Initialize the ranges
|
||||||
|
for line in file.lines() {
|
||||||
|
if line.is_empty() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut parts = line.split("-");
|
||||||
|
let start = parts.next().unwrap().parse::<usize>().unwrap();
|
||||||
|
let end = parts.next().unwrap().parse::<usize>().unwrap();
|
||||||
|
original_ranges.push(start..=end);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort them by start for easier merge in next step
|
||||||
|
original_ranges.sort_by_key(|range| *range.start());
|
||||||
|
|
||||||
|
// merge overlappers
|
||||||
|
for range in original_ranges {
|
||||||
|
if fresh_products_ranges.is_empty() {
|
||||||
|
fresh_products_ranges.push(range);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let last_idx = fresh_products_ranges.len() - 1;
|
||||||
|
let last_range = &fresh_products_ranges[last_idx];
|
||||||
|
|
||||||
|
if *range.start() <= *last_range.end() + 1 {
|
||||||
|
let new_end = *last_range.end().max(range.end());
|
||||||
|
let new_start = *last_range.start();
|
||||||
|
|
||||||
|
fresh_products_ranges[last_idx] = new_start..=new_end;
|
||||||
|
} else {
|
||||||
|
fresh_products_ranges.push(range);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let fresh_products_count = {
|
||||||
|
let mut cnt = 0;
|
||||||
|
for range in &fresh_products_ranges {
|
||||||
|
cnt += range.end() - range.start() + 1;
|
||||||
|
}
|
||||||
|
cnt
|
||||||
|
};
|
||||||
|
println!("Fresh products: {:?}", fresh_products_count);
|
||||||
|
}
|
||||||
@@ -5,5 +5,5 @@ mod day4;
|
|||||||
mod day5;
|
mod day5;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
day5::solve();
|
day5::part2::solve();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user