diff --git a/day02/src/main.rs b/day02/src/main.rs index c6c4618..c33abe4 100644 --- a/day02/src/main.rs +++ b/day02/src/main.rs @@ -17,9 +17,6 @@ impl Values { "A" => Values::Rock, "B" => Values::Paper, "C" => Values::Scissors, - "X" => Values::Rock, - "Y" => Values::Paper, - "Z" => Values::Scissors, _ => panic!("Unexpected value for Values") } } @@ -28,23 +25,61 @@ impl Values { match self { Values::Rock => 1, Values::Paper => 2, - Values::Scissors => 3 + Values::Scissors => 3, } } - fn beats(self, other: Values) -> bool { - if self == Values::Rock { - other == Values::Scissors - } else if self == Values::Paper { - other == Values::Rock - } else if self == Values::Scissors { - other == Values::Paper - } else { - false + fn get_other(&self, play_result: &PlayResult) -> Values { + match self { + Values::Rock => { + match play_result { + PlayResult::Lose => Values::Scissors, + PlayResult::Draw => Values::Rock, + PlayResult::Win => Values::Paper + } + }, + Values::Paper => { + match play_result { + PlayResult::Lose => Values::Rock, + PlayResult::Draw => Values::Paper, + PlayResult::Win => Values::Scissors + } + }, + Values::Scissors => { + match play_result { + PlayResult::Lose => Values::Paper, + PlayResult::Draw => Values::Scissors, + PlayResult::Win => Values::Rock, + } + }, } } } +enum PlayResult { + Lose, + Draw, + Win, +} + +impl PlayResult { + fn get_from_str(v: &str) -> PlayResult { + match v { + "X" => PlayResult::Lose, + "Y" => PlayResult::Draw, + "Z" => PlayResult::Win, + _ => panic!("Unexpected value for PlayResult") + } + } + + fn get_u32(&self) -> u32 { + match self { + PlayResult::Lose => 0, + PlayResult::Draw => 3, + PlayResult::Win => 6 + } + } +} fn main() -> Result<(), Box> { let f = File::open("input.txt")?; @@ -53,15 +88,13 @@ fn main() -> Result<(), Box> { let mut sum: u32 = 0; for line in reader.lines() { let line = line?; - let mut split_result = line.split_whitespace().map(|o| Values::get_from_str(o)); - let other = split_result.next().unwrap(); - let my = split_result.next().unwrap(); + let split_result = line.split_whitespace().collect::>(); + let other = Values::get_from_str(split_result[0]); + let play_result = PlayResult::get_from_str(split_result[1]); + let my = other.get_other(&play_result); + sum += my.get_u32(); - if other == my { - sum += 3; - } else if my.beats(other) { - sum += 6; - } + sum += play_result.get_u32(); } println!("{}", sum);