day 3
parent
c4266bb16c
commit
2dc8abfbc6
@ -0,0 +1,16 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "day03"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"rustc-hash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc-hash"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
|
@ -0,0 +1,9 @@
|
||||
[package]
|
||||
name = "day03"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
rustc-hash = "1.1.0"
|
@ -0,0 +1,52 @@
|
||||
use rustc_hash::FxHashSet;
|
||||
use std::io::{self, BufRead};
|
||||
|
||||
const LOWERCASE_ASCII_OFFSET: usize = 64;
|
||||
const UPPERCASE_ASCII_OFFSET: usize = 32;
|
||||
const LOWERCASE_ALPHA_OFFSET: usize = 26;
|
||||
|
||||
fn main() {
|
||||
let lines = io::stdin().lock().lines().map(|l| l.unwrap());
|
||||
let mut first_half: FxHashSet<char>;
|
||||
let mut second_half: FxHashSet<char>;
|
||||
let mut p1_sum = 0usize;
|
||||
let mut p2_sum = 0usize;
|
||||
|
||||
let mut group_set: FxHashSet<char>;
|
||||
let mut groups: Vec<String> = Vec::new();
|
||||
|
||||
for line in lines {
|
||||
groups.push(line.clone());
|
||||
if groups.len() == 3 {
|
||||
group_set = groups[0]
|
||||
.chars()
|
||||
.collect::<FxHashSet<char>>()
|
||||
.intersection(&groups[1].chars().collect())
|
||||
.copied()
|
||||
.collect::<FxHashSet<char>>()
|
||||
.intersection(&groups[2].chars().collect())
|
||||
.copied()
|
||||
.collect();
|
||||
p2_sum += type_to_priority(group_set.iter().next().unwrap());
|
||||
groups.clear();
|
||||
}
|
||||
|
||||
let (first, second) = line.split_at(line.len() / 2);
|
||||
first_half = first.chars().collect();
|
||||
second_half = second.chars().collect();
|
||||
let shared_type = first_half.intersection(&second_half).next().unwrap();
|
||||
p1_sum += type_to_priority(shared_type);
|
||||
}
|
||||
println!("P1: {}, P2: {}", p1_sum, p2_sum);
|
||||
}
|
||||
|
||||
fn type_to_priority(ptype: &char) -> usize {
|
||||
let mut ascii_val = *ptype as usize;
|
||||
ascii_val -= LOWERCASE_ASCII_OFFSET;
|
||||
if ascii_val > UPPERCASE_ASCII_OFFSET {
|
||||
ascii_val -= UPPERCASE_ASCII_OFFSET
|
||||
} else {
|
||||
ascii_val += LOWERCASE_ALPHA_OFFSET
|
||||
}
|
||||
ascii_val
|
||||
}
|
Loading…
Reference in New Issue