108 lines
2.6 KiB
Rust
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
|
|
}
|