You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

38 lines
1.3 KiB
Rust

fn main() {
let contents = std::fs::read_to_string("data.txt").expect("Failed to read file");
let lines: Vec<&str> = contents.lines().collect();
// Part 1
let sacks: Vec<(&str, &str)> = lines.iter().map(|&x| x.split_at(x.len() / 2)).collect();
let common_items_part1: Vec<char> = sacks.iter().map(find_common_item).collect();
let priorities_part1: Vec<u32> = common_items_part1.iter().map(char_to_code).collect();
let sum_part1: u32 = priorities_part1.iter().sum();
println!("Part 1 Sum: {sum_part1}");
// Part 2
let groups: Vec<&[&str]> = lines.chunks(3).collect();
let common_items_part2: Vec<char> = groups.iter().map(find_badge).collect();
let priorities_part2: Vec<u32> = common_items_part2.iter().map(char_to_code).collect();
let sum_part2: u32 = priorities_part2.iter().sum();
println!("Part 2 Sum: {sum_part2}");
}
fn char_to_code(c: &char) -> u32 {
let offset = if c.is_ascii_uppercase() { 38 } else { 96 };
*c as u32 - offset
}
fn find_common_item(pair: &(&str, &str)) -> char {
pair.0
.chars()
.filter(|&x| pair.1.contains(x))
.collect::<Vec<char>>()[0]
}
fn find_badge(set: &&[&str]) -> char {
set[0]
.chars()
.filter(|&x| set[1].contains(x) && set[2].contains(x))
.collect::<Vec<char>>()[0]
}