use std::fs; enum Hand { Rock = 1, Paper = 2, Scissors = 3, } enum Outcome { Win, Loss, Draw } struct Round { opponent_hand: Hand, player_hand: Hand, } impl Round { fn outcome(&self) -> Outcome { match self.player_hand as i8 - self.opponent_hand as i8 { 0 => Outcome::Draw, 1 | -2 => Outcome::Win, _ => Outcome::Loss, } } fn points(&self) -> u32 { self.player_hand as u32 + match self.outcome() { Outcome::Loss => 0, Outcome::Draw => 3, Outcome::Win => 6, } } } fn read_file(path: &str) -> String { fs::read_to_string(path) .expect("File not Found") } fn parse_round(line: &str, strat: u8) -> Round { let line = line.as_bytes(); let opponent_hand = match line[0] { b'A' => Hand::Rock, b'B' => Hand::Paper, b'C' => Hand::Scissors, _ => panic!("Unexpected Token"), }; let player_hand = match strat { 1 => { match line[2] { b'X' => Hand::Rock, b'Y' => Hand::Paper, b'Z' => Hand::Scissors, _ => panic!("Unexpected Token"), } }, 2 => { match line[2] { b'X' => match opponent_hand { Hand::Rock => Hand::Scissors, Hand::Paper => Hand::Rock, Hand::Scissors => Hand::Paper, }, // Lose b'Y' => opponent_hand, // Draw b'Z' => match opponent_hand{ Hand::Rock => Hand::Paper, Hand::Paper => Hand::Scissors, Hand::Scissors => Hand::Rock, }, // Win _ => panic!("Unexpected Token"), } } }; Round { opponent_hand, player_hand } } fn main() { let contents = read_file("input"); let mut tally1 = 0; let mut tally2 = 0; for line in contents.lines() { if line.len() == 3 { let round1 = parse_round(line, 1); let round2 = parse_round(line, 2); tally1 += round1.points(); tally2 += round2.points(); } } println!("Total Points (Strat 1): {tally1}"); println!("Total Points (Strat 2): {tally2}"); }