summaryrefslogtreecommitdiff
path: root/2023
diff options
context:
space:
mode:
authornekineki <nekineki@nekineki.net>2023-12-05 14:32:10 +0100
committernekineki <nekineki@nekineki.net>2023-12-05 14:32:10 +0100
commit1de6fa0b6ae0ef0279df7640683173aa15743646 (patch)
tree41e834ccd862e2d1f22b413c606b53c2ce17b09a /2023
parent8d63b218ebc0611d32c95ea8cf29f0efc3f614a4 (diff)
day05 reverse search
Diffstat (limited to '2023')
-rw-r--r--2023/day05.rs46
1 files changed, 28 insertions, 18 deletions
diff --git a/2023/day05.rs b/2023/day05.rs
index c879d49..1a74980 100644
--- a/2023/day05.rs
+++ b/2023/day05.rs
@@ -14,13 +14,22 @@ struct SeedMap {
fn do_map(val: u64, sms: &Vec<SeedMap>) -> u64 {
for sm in sms.iter() {
- if (sm.src..sm.src + sm.len).contains(&val) {
+ if (sm.src <= val) && (val < sm.src + sm.len) {
return val + sm.dest - sm.src;
}
}
return val;
}
+fn do_reverse_map(val: u64, sms: &Vec<SeedMap>) -> u64 {
+ for sm in sms.iter() {
+ if (sm.dest <= val) && (val < sm.dest + sm.len) {
+ return val + sm.src - sm.dest;
+ }
+ }
+ return val;
+}
+
fn main() {
// let filename = "in/day05.ref";
let filename = "in/day05.pzl";
@@ -31,9 +40,6 @@ fn main() {
let mut chunks = content.trim_end().split("\n\n");
// println!("{:?}", chunks);
- let mut res1;
- let mut res2 = 999999999999;
-
let mut seeds: Vec<u64> = chunks
.next()
.unwrap()
@@ -63,30 +69,34 @@ fn main() {
all_maps.push(map_vec);
}
- let mut final_seed1 = Vec::new();
- for mut seed in seeds.clone().into_iter() {
- for m in all_maps.iter() {
- seed = do_map(seed, m);
- }
- final_seed1.push(seed);
+ let mut res1 = 999999999999;
+ for seed in seeds.clone().into_iter() {
+ res1 = min(res1, all_maps.iter().fold(seed, |s, m| do_map(s, m)));
}
- final_seed1.sort();
- res1 = final_seed1[0];
let seed_pairs: Vec<_> = seeds
.chunks_exact(2)
.map(|x| (x[0] as u64, x[1] as u64))
.collect();
- for (start, len) in seed_pairs.clone().into_iter() {
- for mut seed in start..(start + len) {
- for m in all_maps.iter() {
- seed = do_map(seed, m);
- }
- res2 = min(res2, seed);
+ let mut res2 = 0;
+ for i in 0.. {
+ let a = all_maps.iter().rev().fold(i, |s, m| do_reverse_map(s, m));
+ if seed_pairs
+ .clone()
+ .into_iter()
+ .filter(|&(start, len)|
+ (start <= a) && (a < start + len))
+ .next()
+ .is_some()
+ {
+ res2 = i;
+ break;
}
}
println!("res1: {}", res1);
println!("res2: {}", res2);
+ assert_eq!(res1, 196167384);
+ assert_eq!(res2, 125742456);
}