This commit is contained in:
Joseph Montanaro 2022-12-02 16:11:46 -08:00
parent c7c444bce9
commit 86eb94514e
3 changed files with 112 additions and 16 deletions

View File

@ -11,6 +11,10 @@ path = "src/lib.rs"
name = "day1"
path = "src/day1.rs"
[[bin]]
name = "day2"
path = "src/day2.rs"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

View File

@ -1,21 +1,5 @@
const DATA: &'static str = include_str!("../data/day1.txt");
// const DATA: &'static str = "1000
// 2000
// 3000
// 4000
// 5000
// 6000
// 7000
// 8000
// 9000
// 10000
// ";
fn main() {
let mut counts = DATA.trim()

108
2022/src/day2.rs Normal file
View File

@ -0,0 +1,108 @@
use std::str::FromStr;
const DATA: &'static str = include_str!("../data/day2.txt");
// const DATA: &'static str = "
// A Y
// B X
// C Z
// ";
enum RPS {
Rock = 1,
Paper = 2,
Scissors = 3,
}
impl FromStr for RPS {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"A" | "X" => Ok(Rock),
"B" | "Y" => Ok(Paper),
"C" | "Z" => Ok(Scissors),
_ => Err(())
}
}
}
enum Outcome {
Win = 6,
Loss = 0,
Draw = 3,
}
impl FromStr for Outcome {
type Err = ();
fn from_str(s: &str) -> Result<Self, ()> {
match s {
"X" => Ok(Loss),
"Y" => Ok(Draw),
"Z" => Ok(Win),
_ => Err(())
}
}
}
use RPS::*;
use Outcome::*;
fn compare(me: &RPS, them: &RPS) -> Outcome {
match (me, them) {
(Rock, Rock) => Draw,
(Rock, Paper) => Loss,
(Rock, Scissors) => Win,
(Paper, Rock) => Win,
(Paper, Paper) => Draw,
(Paper, Scissors) => Loss,
(Scissors, Rock) => Loss,
(Scissors, Paper) => Win,
(Scissors, Scissors) => Draw,
}
}
fn get_response(opponent: &RPS, outcome: &Outcome) -> RPS {
match (opponent, outcome) {
(Rock, Win) => Paper,
(Rock, Loss) => Scissors,
(Rock, Draw) => Rock,
(Paper, Win) => Scissors,
(Paper, Loss) => Rock,
(Paper, Draw) => Paper,
(Scissors, Win) => Rock,
(Scissors, Loss) => Paper,
(Scissors, Draw) => Scissors,
}
}
fn score(me: RPS, them: RPS) -> u64 {
let outcome = compare(&me, &them);
(me as u64) + (outcome as u64)
}
fn main() {
let mut total_1 = 0;
for pair in DATA.trim().split("\n") {
let mut it = pair.split(" ")
.map(|v| v.parse::<RPS>().unwrap());
let (them, me) = (it.next().unwrap(), it.next().unwrap());
total_1 += score(me, them);
}
println!("Part 1: {total_1}");
let mut total_2 = 0;
for pair in DATA.trim().split("\n") {
let mut it = pair.split(" ");
let them = it.next().unwrap().parse::<RPS>().unwrap();
let outcome = it.next().unwrap().parse::<Outcome>().unwrap();
let me = get_response(&them, &outcome);
total_2 += me as u64;
total_2 += outcome as u64
}
println!("Part 2: {total_2}");
}