]> aoc.elinar.fr Git - aoc_2023/commitdiff
Day05 - part 1 (approche naïve non fonctionnelle)
authoralex <null>
Tue, 5 Dec 2023 06:23:18 +0000 (07:23 +0100)
committeralex <null>
Tue, 5 Dec 2023 06:23:20 +0000 (07:23 +0100)
src/day05.rs [new file with mode: 0644]
src/main.rs

diff --git a/src/day05.rs b/src/day05.rs
new file mode 100644 (file)
index 0000000..dda7d5d
--- /dev/null
@@ -0,0 +1,108 @@
+use std::io::Read;
+use std::error::Error;
+use std::fs::File;
+
+pub fn run(input_file: &str) -> Result<(), Box<dyn Error>> {
+    let mut f = File::open(input_file)?;
+    let mut input = String::new();
+    f.read_to_string(&mut input)?;
+
+    let res = run_part1(&input)?;
+    println!("{res}");
+
+    let res = run_part2(&input)?;
+    println!("{res}");
+
+    Ok(())
+}
+
+fn run_part1(input: &str) -> Result<usize, Box<dyn Error>> {
+    println!("Running day05 - part 1");
+    let seeds: Vec<usize> = input.lines().next().unwrap()
+        .split_once(": ").unwrap().1
+        .split(' ')
+        .map(|v| v.parse().unwrap())
+        .collect();
+
+    let mut loc = seeds.clone();
+
+    // parcourir les lignes et on construit un vecteur de mappings
+    // hypothèse, le chaînage est dans l'ordre des lignes et se lit de haut en bas
+    // on parcours les blocs un par un
+    // pour chaque bloc on crée un vecteur correspondant au mapping
+    // puis on extrait la valeur final de chaque graine
+    input.split("\n\n").skip(1)
+        .for_each(|bloc| {
+            let mut map: Vec<usize> = (0..=99).map(|i: usize| i).collect();
+            bloc.split("\n").skip(1)
+                .for_each(|l| {
+                    let values: Vec<usize> = l.split_whitespace()
+                        .map(|s| s.parse().unwrap())
+                        .collect();
+                    let (dst, src, len) = (values[0], values[1], values[2]);
+                    (0..len).for_each(|i| map[src + i] = dst + i);
+                });
+            (0..loc.len()).for_each(|i| loc[i] = map[loc[i]]);
+        });
+
+    let res = loc.into_iter().min().unwrap();
+    Ok(res)
+}
+
+fn run_part2(input: &str) -> Result<usize, Box<dyn Error>> {
+    println!("Running day05 - part 2");
+    let res = 0;
+    Ok(res)
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn day05_part1() {
+        let input = "\
+seeds: 79 14 55 13
+
+seed-to-soil map:
+50 98 2
+52 50 48
+
+soil-to-fertilizer map:
+0 15 37
+37 52 2
+39 0 15
+
+fertilizer-to-water map:
+49 53 8
+0 11 42
+42 0 7
+57 7 4
+
+water-to-light map:
+88 18 7
+18 25 70
+
+light-to-temperature map:
+45 77 23
+81 45 19
+68 64 13
+
+temperature-to-humidity map:
+0 69 1
+1 0 69
+
+humidity-to-location map:
+60 56 37
+56 93 4";
+        let res = run_part1(&input);
+        assert_eq!(35, res.unwrap());
+    }
+
+    #[test]
+    fn day05_part2() {
+        let input = "";
+        let res = run_part2(&input);
+        assert_eq!(0, res.unwrap());
+    }
+}
index 2afbdc453a10f9a3ad6736609ef69a3e44109c70..94539329855e5410bb27f8860276486171e21c21 100644 (file)
@@ -7,6 +7,7 @@ pub mod day01;
 pub mod day02;
 pub mod day03;
 pub mod day04;
+pub mod day05;
 
 fn main() {
     let args: Vec<String> = env::args().collect();
@@ -29,6 +30,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box<dyn Error>> {
         "day02" => day02::run(input_file)?,
         "day03" => day03::run(input_file)?,
         "day04" => day04::run(input_file)?,
+        "day05" => day05::run(input_file)?,
         _ => return Err(format!("unknown day \"{day}\"").into()),
     }
     Ok(())