57 lines
1.2 KiB
Rust
57 lines
1.2 KiB
Rust
#![feature(iter_array_chunks, test)]
|
|
extern crate test;
|
|
use aoc2022::{boilerplate, common::*};
|
|
|
|
const DAY: usize = 2;
|
|
|
|
fn round([other, _, own, _]: [u8; 4]) -> usize {
|
|
(match other.wrapping_sub(own - b'X' + b'A') {
|
|
0 => 3 + own - b'W',
|
|
1 | 254 => own - b'W',
|
|
_ => 6 + own - b'W',
|
|
}) as usize
|
|
}
|
|
|
|
fn round_p2([other, _, own, _]: [u8; 4]) -> usize {
|
|
(match (own, other) {
|
|
(b'Y', _) => other - b'A' + 4,
|
|
(b'X', b'A') => 3,
|
|
(b'X', _) => other - b'A',
|
|
(_, b'C') => 7,
|
|
_ => other - b'A' + 8,
|
|
}) as usize
|
|
}
|
|
|
|
fn parse_input(raw: &str) -> &str {
|
|
raw
|
|
}
|
|
|
|
fn part1(parsed: &str) -> usize {
|
|
parsed.bytes().array_chunks().map(round).sum()
|
|
}
|
|
|
|
fn part2(parsed: &str) -> usize {
|
|
parsed.bytes().array_chunks().map(round_p2).sum()
|
|
}
|
|
|
|
boilerplate! {
|
|
TEST_INPUT == "\
|
|
A Y\n\
|
|
B X\n\
|
|
C Z\n\
|
|
",
|
|
tests: {
|
|
part1: { TEST_INPUT => 15 },
|
|
part2: {
|
|
TEST_INPUT => 12,
|
|
"A X\n" => 3,
|
|
"C X\n" => 2,
|
|
"A Y\n" => 4,
|
|
"A Z\n" => 8,
|
|
},
|
|
},
|
|
bench1 == 13268,
|
|
bench2 == 15508,
|
|
bench_parse: str::len => 10000,
|
|
}
|