pub fn p1(input: &str) -> String { let mut left: Vec = vec![]; let mut right: Vec = vec![]; for line in input.lines() { let mut fields = line.split_whitespace(); let e = "Wrong file format"; left.push(fields.next().expect(e).parse().expect(e)); right.push(fields.next().expect(e).parse().expect(e)); } left.sort_unstable(); right.sort_unstable(); let mut distance: u32 = 0; for i in 0..left.len() { let l = left[i]; let r = right[i]; distance += if l >= r { l - r } else { r - l }; } distance.to_string() } use std::collections::HashMap; pub fn p2(input: &str) -> String { let mut left: Vec = vec![]; let mut right: HashMap = HashMap::new(); for line in input.lines() { let mut fields = line.split_whitespace(); let e = "Wrong file format"; left.push(fields.next().expect(e).parse().expect(e)); let r: u32 = fields.next().expect(e).parse().expect(e); match right.get(&r) { None => right.insert(r, 1), Some(v) => right.insert(r, v + 1), }; } let mut distance: u32 = 0; for l in left { distance += l * right.get(&l).unwrap_or(&0); } distance.to_string() }