1
0
Fork 0
advent-of-code/src/bin/p03.rs

57 lines
1.4 KiB
Rust

#![feature(iterator_try_collect)]
use std::fs;
use std::io::{self, BufRead};
use std::collections::HashSet;
fn main() {
let filename = "etc/p03.txt";
let file = fs::File::open(filename).expect("Can't open file");
let reader = io::BufReader::new(file);
println!("PART ONE ---------------");
let lines = reader.lines().try_collect().expect("Expected all lines to be valid");
part1(&lines);
println!("\n PART TWO ---------------");
part2(&lines);
}
fn to_priority(c: char) -> Result<u32, &'static str> {
if c.is_ascii_uppercase() {
Ok(c as u32 - 'A' as u32 + 26 + 1)
} else if c.is_ascii_lowercase() {
Ok(c as u32 - 'a' as u32 + 1)
} else {
Err("Can't convert non-alphanumeric")
}
}
fn part1(lines: &Vec<String>) {
let mut sum: u32 = 0;
for line in lines {
let (left, right) = line.split_at(line.len() / 2);
let left_set = HashSet::<char>::from_iter(left.chars());
let mut right_set = HashSet::<char>::new();
let outlier = right.chars().find(|c| {
right_set.insert(*c);
left_set.contains(c)
}).expect("Expected at least one duplicate item");
let priority = to_priority(outlier).unwrap();
println!("{} ({})", outlier, priority);
sum += priority;
}
println!("Sum: {}", sum);
}
fn part2(_lines: &Vec<String>) {
}
#[cfg(test)]
mod tests {
use super::*;
}