aoc/src/year2023/day02.rs
2023-12-02 12:21:11 +01:00

87 lines
2.9 KiB
Rust

use crate::util::parse::ParseExt;
pub fn part1(input: &str) -> impl std::fmt::Display {
const RED: u32 = 12;
const GREEN: u32 = 13;
const BLUE: u32 = 14;
input
.lines()
.enumerate()
.filter_map(|(i, l)| {
let (_, cubes) = l.split_once(": ")?;
for draw in cubes.split("; ") {
let mut red = 0;
let mut green = 0;
let mut blue = 0;
for b in draw.split(", ") {
let (num, col) = b.split_once(' ')?;
let num = num.parse_u32();
match col {
"red" => red += num,
"green" => green += num,
"blue" => blue += num,
_ => unreachable!(),
}
}
if red > RED || green > GREEN || blue > BLUE {
return None;
}
}
Some(i + 1)
})
.sum::<usize>()
}
pub fn part2(input: &str) -> impl std::fmt::Display {
input
.lines()
.filter_map(|l| {
let (mut red, mut green, mut blue) = (0, 0, 0);
let (_, cubes) = l.split_once(": ")?;
for draw in cubes.split("; ") {
for b in draw.split(", ") {
let (num, col) = b.split_once(' ')?;
let num = num.parse_u32();
match col {
"red" => {
if num > red {
red = num
}
}
"green" => {
if num > green {
green = num
}
}
"blue" => {
if num > blue {
blue = num
}
}
_ => unreachable!(),
}
}
}
Some(red * green * blue)
})
.sum::<u32>()
}
#[test]
fn test_part1() {
assert_eq!("8", part1("Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green\nGame 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue\nGame 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red\nGame 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red\nGame 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green").to_string())
}
#[test]
fn test_part2() {
assert_eq!("55593", part2("Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green\nGame 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue\nGame 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red\nGame 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red\nGame 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green").to_string())
}