advent-of-code/2022/src/bin/day02.rs

57 lines
1.2 KiB
Rust
Raw Normal View History

2022-12-02 11:03:05 +01:00
#![feature(iter_array_chunks, test)]
extern crate test;
use aoc2022::{boilerplate, common::*};
const DAY: usize = 2;
2022-12-02 13:18:28 +01:00
fn round([other, _, own, _]: [u8; 4]) -> usize {
(match other.wrapping_sub(own - b'X' + b'A') {
0 => 3 + own - b'W',
2022-12-05 11:35:34 +01:00
1 | 254 => own - b'W',
2022-12-02 15:07:19 +01:00
_ => 6 + own - b'W',
2022-12-02 13:18:28 +01:00
}) as usize
2022-12-02 11:03:05 +01:00
}
2022-12-02 13:18:28 +01:00
fn round_p2([other, _, own, _]: [u8; 4]) -> usize {
2022-12-02 15:07:19 +01:00
(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,
2022-12-02 13:18:28 +01:00
}) as usize
2022-12-02 11:03:05 +01:00
}
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! {
2022-12-09 12:50:12 +01:00
TEST_INPUT == "\
A Y\n\
B X\n\
C Z\n\
",
2022-12-02 11:03:05 +01:00
tests: {
part1: { TEST_INPUT => 15 },
2022-12-02 13:18:28 +01:00
part2: {
TEST_INPUT => 12,
"A X\n" => 3,
"C X\n" => 2,
"A Y\n" => 4,
"A Z\n" => 8,
},
2022-12-02 11:03:05 +01:00
},
bench1 == 13268,
bench2 == 15508,
bench_parse: str::len => 10000,
}