summaryrefslogtreecommitdiff
path: root/2023/day05.rs
diff options
context:
space:
mode:
Diffstat (limited to '2023/day05.rs')
-rw-r--r--2023/day05.rs92
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);
+}