diff options
Diffstat (limited to '2023/day05.rs')
| -rw-r--r-- | 2023/day05.rs | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/2023/day05.rs b/2023/day05.rs new file mode 100644 index 0000000..c879d49 --- /dev/null +++ b/2023/day05.rs @@ -0,0 +1,92 @@ +#![allow(dead_code)] +#![allow(unused_variables)] +#![allow(unused_mut)] +use std::cmp::min; +use std::fs::File; +use std::io::Read; + +#[derive(Debug)] +struct SeedMap { + dest: u64, + src: u64, + len: u64, +} + +fn do_map(val: u64, sms: &Vec<SeedMap>) -> u64 { + for sm in sms.iter() { + if (sm.src..sm.src + sm.len).contains(&val) { + return val + sm.dest - sm.src; + } + } + return val; +} + +fn main() { + // let filename = "in/day05.ref"; + let filename = "in/day05.pzl"; + + let mut f = File::open(filename).expect("cannot open file"); + let mut content = String::new(); + f.read_to_string(&mut content).expect("cannot read file"); + 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() + .split_once(":") + .unwrap() + .1 + .split(" ") + .filter_map(|x| x.parse().ok()) + .collect::<Vec<u64>>(); + + let mut all_maps: Vec<Vec<SeedMap>> = Vec::new(); + for chunk in chunks { + let mut chunk = chunk.split('\n'); + let line = chunk.next(); + let mut map_vec: Vec<SeedMap> = Vec::new(); + for line in chunk { + let vals = line + .split(" ") + .filter_map(|x| x.parse().ok()) + .collect::<Vec<u64>>(); + map_vec.push(SeedMap { + dest: vals[0], + src: vals[1], + len: vals[2], + }); + } + 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); + } + 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); + } + } + + println!("res1: {}", res1); + println!("res2: {}", res2); +} |
