diff --git a/day2/src/main.rs b/day2/src/main.rs index 72e4b6c..a6364c3 100644 --- a/day2/src/main.rs +++ b/day2/src/main.rs @@ -10,12 +10,9 @@ enum Symbol { impl From for Symbol { fn from(value: char) -> Self { match value { - 'A' => Self::Rock, - 'B' => Self::Paper, - 'C' => Self::Scissors, - 'X' => Self::Rock, - 'Y' => Self::Paper, - 'Z' => Self::Scissors, + 'A' | 'X' => Self::Rock, + 'B' | 'Y' => Self::Paper, + 'C' | 'Z' => Self::Scissors, _ => panic!("invalid input"), } } diff --git a/day3/src/main.rs b/day3/src/main.rs index d320553..0005f1e 100644 --- a/day3/src/main.rs +++ b/day3/src/main.rs @@ -3,12 +3,12 @@ use std::{collections::HashSet, fs::read_to_string}; use color_eyre::{eyre::*, Result}; use itertools::Itertools; -fn priority(item: &char) -> usize { +fn priority(item: char) -> Result { ('a'..='z') - .position(|c| *item == c) + .position(|c| item == c) .map(|i| i + 1) - .or_else(|| ('A'..='Z').position(|c| *item == c).map(|i| i + 27)) - .unwrap_or(0) + .or_else(|| ('A'..='Z').position(|c| item == c).map(|i| i + 27)) + .ok_or_else(|| eyre!("invalid character '{}'", item)) } fn initial(input: &str) -> (usize, usize) { @@ -20,7 +20,7 @@ fn initial(input: &str) -> (usize, usize) { let compartment2 = compartment2.chars().collect::>(); compartment1 .intersection(&compartment2) - .map(priority) + .filter_map(|v| priority(*v).ok()) .sum::() }) .sum(); @@ -32,7 +32,7 @@ fn initial(input: &str) -> (usize, usize) { group .map(|line| line.chars().collect::>()) .coalesce(|a, b| Ok(a.intersection(&b).copied().collect())) - .map(|set| set.iter().map(priority).sum::()) + .map(|set| set.iter().filter_map(|v| priority(*v).ok()).sum::()) .sum::() }) .sum();