From 2a70e529992fa08bdda87ca7e663730b97fb8e8c Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Thu, 7 Dec 2023 02:24:22 +0100 Subject: day5pt2 --- src/day5pt2.rs | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 60 insertions(+), 9 deletions(-) (limited to 'src/day5pt2.rs') diff --git a/src/day5pt2.rs b/src/day5pt2.rs index 8f95d3d..0d92b5d 100644 --- a/src/day5pt2.rs +++ b/src/day5pt2.rs @@ -1,7 +1,9 @@ +use std::cmp; + pub fn main() { let txt = std::fs::read_to_string("./input/day5.txt").unwrap(); - let mut seeds: Vec = vec![]; + let mut seeds: Vec<(i64, i64)> = vec![]; let mut rules: Vec<(i64, i64, i64)> = vec![]; for (i, line) in txt.lines().enumerate() { @@ -9,23 +11,58 @@ pub fn main() { // dodaj u vec if i != 0 && line.chars().nth(line.len() - 1).unwrap() != ':' { let br: Vec = line.split(" ").map(|s| s.parse().unwrap()).collect(); - rules.push((br[0], br[1], br[2])); + rules.push((br[0], br[1], br[2] - 1)); } } else { // obradi - for i in 0..seeds.len() { - for rule in &rules { - if rule.1 <= seeds[i] && seeds[i] < rule.1 + rule.2 { - seeds[i] += rule.0 - rule.1; - break; + let mut obradjeno: Vec<(i64, i64)> = vec![]; + let mut neobradjeno: Vec<(i64, i64)> = vec![]; + + neobradjeno.clear(); + neobradjeno.extend(seeds.clone()); + + while neobradjeno.len() != 0 { + seeds.clear(); + seeds.extend(neobradjeno.clone()); + neobradjeno.clear(); + + for seed in &seeds { + let mut ind: bool = false; + for rule in &rules { + let l_seed = seed.0; + let r_seed = seed.1; + let l_rule = rule.1; + let r_rule = rule.1 + rule.2; + + if r_rule < l_seed || r_seed < l_rule { + continue; + } + ind = true; + let levi = cmp::max(l_seed, l_rule); + let desni = cmp::min(r_seed, r_rule); + obradjeno.push((levi + rule.0 - rule.1, desni + rule.0 - rule.1)); + + if l_seed != levi { + neobradjeno.push((l_seed, levi - 1)); + } + + if desni != r_seed { + neobradjeno.push((desni + 1, r_seed)); + } + } + + if !ind { + obradjeno.push((seed.0, seed.1)); } } } + + seeds = obradjeno; rules.clear(); } if seeds.is_empty() && line != "" { - seeds = line + let x: Vec = line .split(": ") .collect::>() .get(1) @@ -33,7 +70,21 @@ pub fn main() { .split(" ") .map(|s| s.parse().unwrap()) .collect(); + + let mut j = 0; + while j < x.len() { + seeds.push((x[j], x[j] + x[j + 1] - 1)); + j += 2; + } } } - println!("{}", 0); + + let mut min = i64::MAX; + for seed in seeds { + if seed.0 < min { + min = seed.0; + } + } + + println!("{}", min); } -- cgit v1.2.3