--- /dev/null
+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());
+ }
+}
pub mod day02;
pub mod day03;
pub mod day04;
+pub mod day05;
fn main() {
let args: Vec<String> = env::args().collect();
"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(())