From: alex Date: Tue, 5 Dec 2023 06:23:18 +0000 (+0100) Subject: Day05 - part 1 (approche naïve non fonctionnelle) X-Git-Url: https://aoc.elinar.fr/?a=commitdiff_plain;h=77f2eb234f99e051a8085a2e71eeb6cd94f8c24e;p=aoc_2023 Day05 - part 1 (approche naïve non fonctionnelle) --- diff --git a/src/day05.rs b/src/day05.rs new file mode 100644 index 0000000..dda7d5d --- /dev/null +++ b/src/day05.rs @@ -0,0 +1,108 @@ +use std::io::Read; +use std::error::Error; +use std::fs::File; + +pub fn run(input_file: &str) -> Result<(), Box> { + 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> { + println!("Running day05 - part 1"); + let seeds: Vec = 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 = (0..=99).map(|i: usize| i).collect(); + bloc.split("\n").skip(1) + .for_each(|l| { + let values: Vec = 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> { + 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()); + } +} diff --git a/src/main.rs b/src/main.rs index 2afbdc4..9453932 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,7 @@ pub mod day01; pub mod day02; pub mod day03; pub mod day04; +pub mod day05; fn main() { let args: Vec = env::args().collect(); @@ -29,6 +30,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box> { "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(())