use std::error::Error;
use std::path::Path;
use std::iter::zip;
+use std::collections::HashMap;
pub fn run(input: &str) -> Result<(), Box<dyn Error>> {
let res = run_part1(&input)?;
println!("{res}");
+ let res = run_part2(&input)?;
+ println!("{res}");
+
Ok(())
}
Ok(res)
}
+fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
+ let filename = file!();
+ let filename = Path::new(filename).file_stem().unwrap().to_str().unwrap();
+ println!("Running {} - part 2", filename);
+
+ let mut a = Vec::new();
+ let mut b = HashMap::new();
+ for l in input.lines() {
+ let v: Vec<u32> = l.split(" ")
+ .map(|s| s.parse::<u32>().unwrap())
+ .collect();
+ a.push(v[0]);
+ b.entry(v[1]).and_modify(|c| *c += 1).or_insert(1);
+ }
+ let res = a.iter()
+ .map(|i| i * b.get(i).unwrap_or(&0))
+ .sum();
+ Ok(res)
+}
+
#[cfg(test)]
mod tests {
use super::*;
fn day01_part1() {
assert_eq!(11, run_part1(TEXT_INPUT).unwrap());
}
+
+ #[test]
+ fn day01_part2() {
+ assert_eq!(31, run_part2(TEXT_INPUT).unwrap());
+ }
}