Add day2
This commit is contained in:
		
							parent
							
								
									57c6e61b8e
								
							
						
					
					
						commit
						00fda7f0ba
					
				
							
								
								
									
										105
									
								
								src/bin/day2.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								src/bin/day2.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,105 @@ | |||||||
|  | use aoc2022::StdError; | ||||||
|  | use std::fs::File; | ||||||
|  | use std::io::{BufRead, BufReader}; | ||||||
|  | 
 | ||||||
|  | #[derive(PartialEq, Clone, Copy)] | ||||||
|  | enum Move { | ||||||
|  |     Rock, | ||||||
|  |     Paper, | ||||||
|  |     Scissors, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | enum Outcome { | ||||||
|  |     Win, | ||||||
|  |     Loss, | ||||||
|  |     Draw, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl Outcome { | ||||||
|  |     fn from_char(c: char) -> Option<Self> { | ||||||
|  |         match c { | ||||||
|  |             'X' => Some(Self::Loss), | ||||||
|  |             'Y' => Some(Self::Draw), | ||||||
|  |             'Z' => Some(Self::Win), | ||||||
|  |             _ => None, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn score(&self) -> u8 { | ||||||
|  |         match self { | ||||||
|  |             Self::Win => 6, | ||||||
|  |             Self::Draw => 3, | ||||||
|  |             Self::Loss => 0, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl Move { | ||||||
|  |     fn from_char(c: char) -> Option<Self> { | ||||||
|  |         match c { | ||||||
|  |             'A' | 'X' => Some(Self::Rock), | ||||||
|  |             'B' | 'Y' => Some(Self::Paper), | ||||||
|  |             'C' | 'Z' => Some(Self::Scissors), | ||||||
|  |             _ => None, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn outcome_for_move(&self, other: &Self) -> Outcome { | ||||||
|  |         match (self, other) { | ||||||
|  |             (Self::Rock, Self::Rock) | ||||||
|  |             | (Self::Paper, Self::Paper) | ||||||
|  |             | (Self::Scissors, Self::Scissors) => Outcome::Draw, | ||||||
|  |             (Self::Rock, Self::Scissors) => Outcome::Win, | ||||||
|  |             (Self::Rock, Self::Paper) => Outcome::Loss, | ||||||
|  |             (Self::Paper, Self::Rock) => Outcome::Win, | ||||||
|  |             (Self::Paper, Self::Scissors) => Outcome::Loss, | ||||||
|  |             (Self::Scissors, Self::Paper) => Outcome::Win, | ||||||
|  |             (Self::Scissors, Self::Rock) => Outcome::Loss, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn move_for_outcome(&self, outcome: Outcome) -> Move { | ||||||
|  |         match (self, outcome) { | ||||||
|  |             (Self::Rock, Outcome::Win) => Move::Paper, | ||||||
|  |             (Self::Rock, Outcome::Loss) => Move::Scissors, | ||||||
|  |             (Self::Paper, Outcome::Win) => Move::Scissors, | ||||||
|  |             (Self::Paper, Outcome::Loss) => Move::Rock, | ||||||
|  |             (Self::Scissors, Outcome::Win) => Move::Rock, | ||||||
|  |             (Self::Scissors, Outcome::Loss) => Move::Paper, | ||||||
|  |             (_, Outcome::Draw) => *self, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn score(&self) -> u8 { | ||||||
|  |         match self { | ||||||
|  |             Self::Rock => 1, | ||||||
|  |             Self::Paper => 2, | ||||||
|  |             Self::Scissors => 3, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn main() -> StdError<()> { | ||||||
|  |     let lines: Vec<_> = BufReader::new(File::open("input/day2.txt")?) | ||||||
|  |         .lines() | ||||||
|  |         .filter_map(Result::ok) | ||||||
|  |         .map(|l| { | ||||||
|  |             let spl: Vec<_> = l.chars().collect(); | ||||||
|  |             assert!(spl.len() == 3); | ||||||
|  |             (spl[0], spl[2]) | ||||||
|  |         }) | ||||||
|  |         .collect(); | ||||||
|  |     let part1: u32 = lines | ||||||
|  |         .iter() | ||||||
|  |         .map(|(a, b)| (Move::from_char(*a).unwrap(), Move::from_char(*b).unwrap())) | ||||||
|  |         .map(|(opponent, you)| (you.score() + you.outcome_for_move(&opponent).score()) as u32) | ||||||
|  |         .sum(); | ||||||
|  |     println!("Part 1: {}", part1); | ||||||
|  |     let part2: u32 = lines | ||||||
|  |         .iter() | ||||||
|  |         .map(|(a, b)| (Move::from_char(*a).unwrap(), Outcome::from_char(*b).unwrap())) | ||||||
|  |         .map(|(opp, out)| (out.score() + opp.move_for_outcome(out).score()) as u32) | ||||||
|  |         .sum(); | ||||||
|  |     println!("Part 2: {}", part2); | ||||||
|  |     Ok(()) | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user