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(())
}
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)]
}
#[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());
}
}