From 4daa8d17b81d511c802543a50b3a3fe512958a60 Mon Sep 17 00:00:00 2001 From: Lars Martens Date: Sun, 1 Dec 2024 11:42:54 +0100 Subject: [PATCH] Solve 01 --- input/01-test | 6 ++++++ src/bin/01.rs | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 input/01-test create mode 100644 src/bin/01.rs diff --git a/input/01-test b/input/01-test new file mode 100644 index 0000000..b8af9ad --- /dev/null +++ b/input/01-test @@ -0,0 +1,6 @@ +3 4 +4 3 +2 5 +1 3 +3 9 +3 3 diff --git a/src/bin/01.rs b/src/bin/01.rs new file mode 100644 index 0000000..b3b559c --- /dev/null +++ b/src/bin/01.rs @@ -0,0 +1,38 @@ +use aoc::*; +use itertools::Itertools; + +const INPUT: &str = include_str!("../../input/01"); + +fn main() { + assert_example!(part1, "01-test", 11); + println!("Part 1: {}", part1(INPUT)); + assert_example!(part2, "01-test", 31); + println!("Part 2: {}", part2(INPUT)); +} + +fn part1(input: &str) -> usize { + let (left, right) = parse(input); + let pairs = left.into_iter().sorted().zip(right.into_iter().sorted()); + pairs.map(|(left, right)| left.abs_diff(right)).sum() +} + +fn part2(input: &str) -> usize { + let (left, right) = parse(input); + left.into_iter().map(|l| similarity(l, &right)).sum() +} + +fn similarity(left: usize, right: &[usize]) -> usize { + let count = right.iter().filter(|&&r| r == left).count(); + count * left +} + +fn parse(input: &str) -> (Vec, Vec) { + input.lines().map(parse_line).unzip() +} + +fn parse_line(line: &str) -> (usize, usize) { + let mut numbers = line.split_whitespace(); + let left = numbers.next().unwrap().parse().unwrap(); + let right = numbers.next().unwrap().parse().unwrap(); + (left, right) +}