Codinget 2 years ago
parent 428b3da1d9
commit 5d6d91f075
  1. 1
      d2/.gitignore
  2. 7
      d2/Cargo.lock
  3. 8
      d2/Cargo.toml
  4. 89
      d2/src/main.rs

1
d2/.gitignore vendored

@ -0,0 +1 @@
/target

7
d2/Cargo.lock generated

@ -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…
Cancel
Save