Solve day 2
This commit is contained in:
parent
646925298c
commit
6255df55e5
2 changed files with 98 additions and 0 deletions
5
input/02-test
Normal file
5
input/02-test
Normal file
|
@ -0,0 +1,5 @@
|
|||
Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
|
||||
Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
|
||||
Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
|
||||
Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
|
||||
Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green
|
93
src/bin/02.rs
Normal file
93
src/bin/02.rs
Normal file
|
@ -0,0 +1,93 @@
|
|||
const INPUT: &str = include_str!("../../input/02");
|
||||
const TEST_INPUT: &str = include_str!("../../input/02-test");
|
||||
|
||||
fn main() {
|
||||
assert_eq!(part1(TEST_INPUT), 8);
|
||||
println!("Part 1: {}", part1(INPUT));
|
||||
|
||||
assert_eq!(part2(TEST_INPUT), 2286);
|
||||
println!("Part 2: {}", part2(INPUT));
|
||||
}
|
||||
|
||||
fn part1(input: &str) -> u32 {
|
||||
parse(input)
|
||||
.filter(|game| game.is_possible())
|
||||
.map(|game| game.id)
|
||||
.sum()
|
||||
}
|
||||
|
||||
fn part2(input: &str) -> u32 {
|
||||
parse(input)
|
||||
.map(|game| game.max_set())
|
||||
.map(|set| set.power())
|
||||
.sum()
|
||||
}
|
||||
|
||||
struct Game {
|
||||
id: u32,
|
||||
revealed: Vec<Set>,
|
||||
}
|
||||
|
||||
impl Game {
|
||||
fn is_possible(&self) -> bool {
|
||||
self.revealed
|
||||
.iter()
|
||||
.all(|set| set.r <= 12 && set.g <= 13 && set.b <= 14)
|
||||
}
|
||||
|
||||
fn max_set(&self) -> Set {
|
||||
self.revealed.iter().fold(Set::default(), |a, b| Set {
|
||||
r: a.r.max(b.r),
|
||||
g: a.g.max(b.g),
|
||||
b: a.b.max(b.b),
|
||||
})
|
||||
}
|
||||
|
||||
fn parse(line: &str) -> Self {
|
||||
let (game, revealed) = line.split_once(": ").unwrap();
|
||||
let id = game
|
||||
.split_ascii_whitespace()
|
||||
.last()
|
||||
.unwrap()
|
||||
.parse()
|
||||
.unwrap();
|
||||
let revealed = revealed.split("; ").map(Set::parse).collect();
|
||||
|
||||
Self { id, revealed }
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
struct Set {
|
||||
r: u32,
|
||||
g: u32,
|
||||
b: u32,
|
||||
}
|
||||
|
||||
impl Set {
|
||||
fn power(&self) -> u32 {
|
||||
self.r * self.g * self.b
|
||||
}
|
||||
|
||||
fn parse(s: &str) -> Self {
|
||||
let colors = s.split(", ");
|
||||
let mut result = Self::default();
|
||||
|
||||
for color in colors {
|
||||
let (count, color) = color.split_once(" ").unwrap();
|
||||
let count = count.parse().unwrap();
|
||||
match color {
|
||||
"red" => result.r = count,
|
||||
"green" => result.g = count,
|
||||
"blue" => result.b = count,
|
||||
other => panic!("unknown color: {other}"),
|
||||
}
|
||||
}
|
||||
|
||||
result
|
||||
}
|
||||
}
|
||||
|
||||
fn parse(input: &str) -> impl Iterator<Item = Game> + '_ {
|
||||
input.lines().map(Game::parse)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue