aoc/src/aoc2023/day02/mod.rs
2023-12-02 22:04:04 +01:00

108 lines
2.6 KiB
Rust

pub fn task_one(input: &str) -> String {
let list = parse_into_game_list(&input);
let mut sum = 0;
// only 12 red cubes, 13 green cubes, and 14 blue cubes
for game in list {
let mut game_possible = true;
for draw in game.draws {
if draw.red > 12 || draw.green > 13 || draw.blue > 14 {
game_possible = false;
break;
}
}
if game_possible {
sum += game.number;
}
}
sum.to_string()
}
pub fn task_two(input: &str) -> String {
let list = parse_into_game_list(&input);
let mut sum = 0;
for game in list {
let mut highest_red = 0;
let mut highest_green = 0;
let mut highest_blue = 0;
for draw in game.draws {
if draw.red > highest_red {
highest_red = draw.red;
}
if draw.green > highest_green {
highest_green = draw.green;
}
if draw.blue > highest_blue {
highest_blue = draw.blue;
}
}
sum += highest_red * highest_green * highest_blue;
}
sum.to_string()
}
struct Game {
draws: Vec<Draw>,
number: u32
}
struct Draw {
red: u32,
green: u32,
blue: u32
}
fn parse_into_game_list(input: &str) -> Vec<Game> {
let mut list = Vec::new();
for line in input.lines() {
let mut game_number = 0;
let mut draws = Vec::new();
// Game 4: 14 green, 14 red, 1 blue; 15 red, 13 green, 1 blue; 6 green, 15 red; 7 green
let mut it = line.split_whitespace();
let mut draw = Draw { red: 0, green: 0, blue: 0 };
while let Some(val) = it.next() {
if val.ends_with(":") {
game_number = val.trim_matches(':').parse().unwrap();
}
let number = val.parse::<u32>();
if number.is_ok() {
let color_and_delimiter = it.next().unwrap();
let x: &[_] = &[';', ','];
let color = color_and_delimiter.trim_matches(x);
match color {
"green" => draw.green = number.unwrap(),
"red" => draw.red = number.unwrap(),
"blue" => draw.blue = number.unwrap(),
_ => panic!("")
}
if color_and_delimiter.ends_with(";") {
draws.push(draw);
draw = Draw { red: 0, green: 0, blue: 0 };
}
}
}
draws.push(draw);
list.push(Game { draws, number: game_number });
}
list
}