This commit is contained in:
max.nuding 2022-12-02 07:06:34 +01:00
parent 8dc9b8fcbb
commit 38f1b5a037
Failed to extract signature

View File

@ -1,17 +1,78 @@
use crate::read; use crate::read;
struct Hand { struct Hand {
pub letter: char, pub letter: char
}
impl Hand {
pub fn score(&self) -> i32 {
match self.letter {
'A' => 1,
'B' => 2,
'C' => 3,
'X' => 1,
'Y' => 2,
'Z' => 3,
_ => panic!("Unknown hand {}", self.letter)
}
}
pub fn outcome(&self, other: &Hand) -> i32 {
match self.score() - other.score() {
-1 => 0,
-2 => 6,
0 => 3,
1 => 6,
2 => 0,
_ => panic!("Unknown match {} vs {}", self.letter, other.letter)
}
}
pub fn outcome_b(&self) -> i32 {
match self.letter {
'X' => 0,
'Y' => 3,
'Z' => 6,
_ => panic!("Unknown outcome {}", self.letter)
}
}
pub fn for_outcome(&self, enemy: &Hand) -> Self {
let letter = match (self.outcome_b(), enemy.letter) {
(o, l) if o == 3 => l,
(o, l) if o == 0 && l == 'A' => 'C',
(o, l) if o == 0 && l == 'B' => 'A',
(o, l) if o == 0 && l == 'C' => 'B',
(o, l) if o == 6 && l == 'A' => 'B',
(o, l) if o == 6 && l == 'B' => 'C',
(o, l) if o == 6 && l == 'C' => 'A',
(o, l)=> panic!("Unknown pairing {}/{}", o, l)
};
Self {
letter
}
}
} }
struct Round { struct Round {
enemy: Hand, pub enemy: Hand,
me: Hand, pub me: Hand,
}
impl Round {
pub fn score(&self) -> i32 {
self.me.score() + self.me.outcome(&self.enemy)
}
pub fn score_b(&self) -> i32 {
let me = self.me.for_outcome(&self.enemy);
me.score() + self.me.outcome_b()
}
} }
pub fn run() { pub fn run() {
let input = read("02"); let input = read("02");
let lines = input.lines().map(|l| { let rounds = input.lines().map(|l| {
let hands = l.split(' ').collect::<Vec<_>>(); let hands = l.split(' ').collect::<Vec<_>>();
Round { Round {
enemy: Hand { enemy: Hand {
@ -21,17 +82,24 @@ pub fn run() {
letter: hands[1].chars().next().unwrap(), letter: hands[1].chars().next().unwrap(),
}, },
} }
}); }
).collect::<Vec<_>>();
#[cfg(feature = "part1")] #[cfg(feature = "part1")]
{ {
let a = "TODO"; let a: i32 = rounds
.iter()
.map(|r|r.score())
.sum();
eprintln!("Day 2, Part 01: {}", a); eprintln!("Day 2, Part 01: {}", a);
} }
#[cfg(feature = "part2")] #[cfg(feature = "part2")]
{ {
let b = "TODO"; let b: i32 = rounds
.iter()
.map(|r|r.score_b())
.sum();
eprintln!("Day 2, Part 02: {}", b); eprintln!("Day 2, Part 02: {}", b);
} }
} }