]> aoc.elinar.fr Git - aoc_2023/commitdiff
Day01 - part 2
authoralex <null>
Fri, 1 Dec 2023 11:58:57 +0000 (12:58 +0100)
committeralex <null>
Sat, 2 Dec 2023 05:14:39 +0000 (06:14 +0100)
src/day01.rs

index 861539d6ba0b3a0a18e66b98cd0adc6091552686..5dcee5d8164db63a28a41fe7396e0598095a3442 100644 (file)
@@ -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<dyn Error>> {
-    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<u32, Box<dyn Error>> {
     Ok(res)
 }
 
-fn run_part2(input: &str) -> Result<String, Box<dyn Error>> {
+fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
     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());
     }
 }