From 40922a13cbf805894ad87b32d81019d08320dc1f Mon Sep 17 00:00:00 2001 From: Codinget Date: Mon, 5 Dec 2022 18:03:32 +0000 Subject: [PATCH] day 3 --- d3/Cargo.lock | 7 +++++++ d3/Cargo.toml | 8 ++++++++ d3/src/main.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 d3/Cargo.lock create mode 100644 d3/Cargo.toml create mode 100644 d3/src/main.rs diff --git a/d3/Cargo.lock b/d3/Cargo.lock new file mode 100644 index 0000000..dc31ee7 --- /dev/null +++ b/d3/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "d3" +version = "0.1.0" diff --git a/d3/Cargo.toml b/d3/Cargo.toml new file mode 100644 index 0000000..0ed60d4 --- /dev/null +++ b/d3/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "d3" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/d3/src/main.rs b/d3/src/main.rs new file mode 100644 index 0000000..ec67cd3 --- /dev/null +++ b/d3/src/main.rs @@ -0,0 +1,44 @@ +use std::{io::Result, fs::read_to_string, collections::HashSet}; + +pub fn priority(x: u8) -> u32 { + (match x { + 0x61..=0x7a => x - 0x61 + 1, + 0x41..=0x5a => x - 0x41 + 27, + _ => unreachable!() + }) as u32 +} + +fn main() -> Result<()> { + let mut p1_priority: u32 = 0; + let mut p2_priority: u32 = 0; + + let mut i = 0; + let mut elves: Vec> = Vec::new(); + + for line in read_to_string("input.txt")?.split("\n") { + if line.is_empty() { continue; } + let bytes = line.as_bytes(); + + let (first_half, second_half) = bytes.split_at(bytes.len() / 2); + let in_first_half = first_half.iter().copied().collect::>(); + let in_second_half = second_half.iter().copied().collect::>(); + let in_both_halves = in_first_half.intersection(&in_second_half).copied().next().unwrap(); + p1_priority += priority(in_both_halves); + + let items = bytes.iter().copied().collect::>(); + elves.push(items.clone()); + if i == 2 { + let badge = items.iter().filter(|item| elves.iter().filter(|elf| elf.contains(item)).count() == 3).copied().next().unwrap(); + p2_priority += priority(badge); + elves.clear(); + i = 0; + } else { + i += 1; + } + } + + println!("part 1: {}", p1_priority); + println!("part 2: {}", p2_priority); + + Ok(()) +}