From 7e4c8522371f1bc8ed9c17581920557951c6cdf1 Mon Sep 17 00:00:00 2001 From: Jeremy Kaplan Date: Fri, 2 Dec 2022 21:14:04 -0800 Subject: [PATCH] 2022 Day 3 --- 2022/Cargo.lock | 16 +++++++++++++ 2022/Cargo.toml | 1 + 2022/src/bin/day03.rs | 52 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 2022/src/bin/day03.rs diff --git a/2022/Cargo.lock b/2022/Cargo.lock index 91987e2..7d7bd32 100644 --- a/2022/Cargo.lock +++ b/2022/Cargo.lock @@ -13,4 +13,20 @@ name = "aoc2022" version = "0.1.0" dependencies = [ "anyhow", + "itertools", +] + +[[package]] +name = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", ] diff --git a/2022/Cargo.toml b/2022/Cargo.toml index 94bd1a2..0c7370c 100644 --- a/2022/Cargo.toml +++ b/2022/Cargo.toml @@ -5,3 +5,4 @@ edition = "2021" [dependencies] anyhow = "1.0.66" +itertools = "0.10.5" diff --git a/2022/src/bin/day03.rs b/2022/src/bin/day03.rs new file mode 100644 index 0000000..ce7f24b --- /dev/null +++ b/2022/src/bin/day03.rs @@ -0,0 +1,52 @@ +use std::collections::HashSet; + +use itertools::Itertools; + +const INPUT: &str = include_str!("../../input/day03.txt"); + +fn main() { + println!("{}", part1(INPUT)); + println!("{}", part2(INPUT)); +} + +fn part1(input: &str) -> usize { + let mut sum = 0; + for line in input.split('\n').filter(|l| !l.is_empty()) { + let mid = line.len() / 2; + + let l = &line[..mid]; + let r = &line[mid..]; + + let first: HashSet = l.chars().collect(); + let second: HashSet = r.chars().collect(); + + let shared = first.intersection(&second).next().unwrap(); + sum += priority(shared); + } + sum +} + +const ALPHABET: &str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +fn priority(c: &char) -> usize { + 1 + ALPHABET.chars().position(|x| x == *c).unwrap_or_default() +} + +fn part2(input: &str) -> usize { + let mut sum = 0; + let lines = input.split('\n').filter(|l| !l.is_empty()); + for group in &lines.chunks(3) { + let sets: Vec> = group + .map(|rucksack| rucksack.chars().collect::>()) + .collect(); + + let mut shared = sets[0].clone(); + shared = shared.intersection(&sets[1]).cloned().collect(); + shared = shared.intersection(&sets[2]).cloned().collect(); + + let badge = shared.iter().next().unwrap(); + + sum += priority(badge); + } + sum +}