master
george 2 years ago
parent c4266bb16c
commit 2dc8abfbc6

@ -38,7 +38,7 @@ fn play_score(opponent: &str, player: &str) -> usize {
player_win_score(player) + outcome as usize player_win_score(player) + outcome as usize
} }
fn player_hand_for_outcome<'a>(outcome: &Outcome, opponent: &str) -> &'a str { fn player_hand_for_outcome(outcome: &Outcome, opponent: &str) -> &'static str {
match outcome { match outcome {
Outcome::Won => match opponent { Outcome::Won => match opponent {
"A" => "Y", "A" => "Y",

16
day03/Cargo.lock generated

@ -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…
Cancel
Save