aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksa@vuckovic.cc>2023-12-07 02:24:22 +0100
committerAleksa Vuckovic <aleksa@vuckovic.cc>2023-12-07 02:24:22 +0100
commit2a70e529992fa08bdda87ca7e663730b97fb8e8c (patch)
treece2d5259e47f36fa98c0782c1bad42e25e931890
parent8089545c22b1ae4a98e967f070c3e298e6808961 (diff)
day5pt2
-rw-r--r--src/day5pt2.rs69
1 files changed, 60 insertions, 9 deletions
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<i64> = 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<i64> = 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<i64> = line
.split(": ")
.collect::<Vec<_>>()
.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);
}