87 lines
2.9 KiB
Rust
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())
|
|
}
|