From a5529562e9e80be4a2302a2e16d657001afa6ec1 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 1 Dec 2023 12:58:57 +0100 Subject: [PATCH] Day01 - part 2 --- src/day01.rs | 77 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 70 insertions(+), 7 deletions(-) diff --git a/src/day01.rs b/src/day01.rs index 861539d..5dcee5d 100644 --- a/src/day01.rs +++ b/src/day01.rs @@ -1,16 +1,18 @@ use std::io::Read; use std::error::Error; use std::fs::File; +use std::collections::HashMap; pub fn run() -> Result<(), Box> { - let mut f = File::open("../input/day01.txt")?; + let mut f = File::open("input/day01.txt")?; let mut input = String::new(); f.read_to_string(&mut input)?; let res = run_part1(&input)?; println!("{res}"); - run_part2(&input)?; + let res = run_part2(&input)?; + println!("{res}"); Ok(()) } @@ -28,9 +30,64 @@ fn run_part1(input: &str) -> Result> { Ok(res) } -fn run_part2(input: &str) -> Result> { +fn run_part2(input: &str) -> Result> { println!("Running day01 - part 2"); - Ok(input.to_string()) + + let map: HashMap<&str, u32> = HashMap::from([ + ("one", 1), + ("two", 2), + ("three", 3), + ("four", 4), + ("five", 5), + ("six", 6), + ("seven", 7), + ("eight", 8), + ("nine", 9), + ]); + + // on cherche soit le premier digit soit le premier chiffre en toute lettre + // par la gauche (left search) + // par la droite (right search) + // + // on peut lister les index de chaque digit + // stocker (index, valeur) + // + // faire de même pour chaque chiffre trouvé dans la chaîne + // + let mut res = 0; + for l in input.lines() { + let mut digits: Vec<(usize, u32)> = l.chars() + .enumerate() + .filter(|(_, c)| c.is_digit(10)) + .map(|(i, c)| (i, c.to_digit(10).unwrap())) + .collect(); + //println!("digits: {:?}", digits); + + let mut numbers: Vec<(usize, u32)> = Vec::new(); + + for (key, val) in map.iter() { + let mut matches: Vec<(usize, u32)> = l.match_indices(key) + .map(|(i, _)| (i, *val)) + .collect(); + numbers.append(&mut matches); + } + numbers.sort_by(|(i, _), (j, _)| i.cmp(j)); + //println!("numbers: {:?}", numbers); + + // on concatene les 2 vecteurs + // chaque index est unique dans chaque vecteur et entre les vecteurs + // l'index d'un digit ne peut pas être l'index d'un chiffre en lettre + // (et inversement) + + digits.append(&mut numbers); + digits.sort_by(|(i, _), (j, _)| i.cmp(j)); + //println!("digits sorted: {:?}", digits); + + //println!("found: {}{}", digits[0].1, digits[digits.len() - 1].1); + res += 10 * digits[0].1 + digits[digits.len() - 1].1; + } + + Ok(res) } #[cfg(test)] @@ -49,10 +106,16 @@ treb7uchet"; } #[test] - fn day02_part2() { + fn day01_part2() { let input = "\ -blabla"; +two1nine +eightwothree +abcone2threexyz +xtwone3four +4nineeightseven2 +zoneight234 +7pqrstsixteen"; let res = run_part2(&input); - assert_eq!("blabla", res.unwrap()); + assert_eq!(281, res.unwrap()); } } -- 2.39.5