parent
428b3da1d9
commit
5d6d91f075
@ -0,0 +1 @@ |
|||||||
|
/target |
@ -0,0 +1,7 @@ |
|||||||
|
# This file is automatically @generated by Cargo. |
||||||
|
# It is not intended for manual editing. |
||||||
|
version = 3 |
||||||
|
|
||||||
|
[[package]] |
||||||
|
name = "d2" |
||||||
|
version = "0.1.0" |
@ -0,0 +1,8 @@ |
|||||||
|
[package] |
||||||
|
name = "d2" |
||||||
|
version = "0.1.0" |
||||||
|
edition = "2021" |
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html |
||||||
|
|
||||||
|
[dependencies] |
@ -0,0 +1,89 @@ |
|||||||
|
use std::fs::read_to_string; |
||||||
|
use std::io::Error; |
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)] |
||||||
|
enum RPS { |
||||||
|
Rock, |
||||||
|
Paper, |
||||||
|
Scissor, |
||||||
|
} |
||||||
|
use RPS::*; |
||||||
|
|
||||||
|
impl RPS { |
||||||
|
fn from_char(c: char) -> Self { |
||||||
|
match c { |
||||||
|
'A' | 'X' => Rock, |
||||||
|
'B' | 'Y' => Paper, |
||||||
|
'C' | 'Z' => Scissor, |
||||||
|
_ => panic!() |
||||||
|
} |
||||||
|
} |
||||||
|
pub fn score(self) -> u32 { |
||||||
|
match self { |
||||||
|
Rock => 1, |
||||||
|
Paper => 2, |
||||||
|
Scissor => 3, |
||||||
|
} |
||||||
|
} |
||||||
|
pub fn outcome(opponent: Self, you: Self) -> Outcome { |
||||||
|
match (you, opponent) { |
||||||
|
(Rock, Rock) | (Paper, Paper) | (Scissor, Scissor) => Draw, |
||||||
|
(Rock, Scissor) | (Paper, Rock) | (Scissor, Paper) => Win, |
||||||
|
(Rock, Paper) | (Paper, Scissor) | (Scissor, Rock) => Loss, |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)] |
||||||
|
enum Outcome { |
||||||
|
Win, |
||||||
|
Loss, |
||||||
|
Draw, |
||||||
|
} |
||||||
|
use Outcome::*; |
||||||
|
|
||||||
|
impl Outcome { |
||||||
|
pub fn from_char(c: char) -> Self { |
||||||
|
match c { |
||||||
|
'X' => Loss, |
||||||
|
'Y' => Draw, |
||||||
|
'Z' => Win, |
||||||
|
_ => panic!() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
pub fn score(self) -> u32 { |
||||||
|
match self { |
||||||
|
Win => 6, |
||||||
|
Draw => 3, |
||||||
|
Loss => 0 |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
pub fn for_opponent(self, opponent: RPS) -> RPS { |
||||||
|
match (self, opponent) { |
||||||
|
(Win, Rock) | (Draw, Paper) | (Loss, Scissor) => Paper, |
||||||
|
(Win, Paper) | (Draw, Scissor) | (Loss, Rock) => Scissor, |
||||||
|
(Win, Scissor) | (Draw, Rock) | (Loss, Paper) => Rock, |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fn main() -> Result<(), Error> { |
||||||
|
let mut total_score_p1 = 0; |
||||||
|
let mut total_score_p2 = 0; |
||||||
|
for line in read_to_string("input.txt")?.split("\n") { |
||||||
|
if line.is_empty() { continue } |
||||||
|
let (opponent, you) = (line.chars().nth(0).unwrap(), line.chars().nth(2).unwrap()); |
||||||
|
let (opponent, your_move, outcome) = (RPS::from_char(opponent), RPS::from_char(you), Outcome::from_char(you)); |
||||||
|
let score_p1 = your_move.score() + RPS::outcome(opponent, your_move).score(); |
||||||
|
total_score_p1 += score_p1; |
||||||
|
let score_p2 = outcome.score() + outcome.for_opponent(opponent).score(); |
||||||
|
total_score_p2 += score_p2; |
||||||
|
} |
||||||
|
|
||||||
|
println!("part 1: {}", total_score_p1); |
||||||
|
println!("part 2: {}", total_score_p2); |
||||||
|
|
||||||
|
Ok(()) |
||||||
|
} |
Loading…
Reference in new issue