|
|
@@ -21,13 +21,13 @@ fn read_lines(filename: &str) -> Vec<String> {
|
|
|
|
|
|
result
|
|
|
}
|
|
|
-
|
|
|
+#[derive(Clone)]
|
|
|
struct Reveal {
|
|
|
red: i32,
|
|
|
green: i32,
|
|
|
blue: i32,
|
|
|
}
|
|
|
-
|
|
|
+#[derive(Clone)]
|
|
|
struct Game {
|
|
|
id: i32,
|
|
|
reveals: Vec<Reveal>,
|
|
|
@@ -98,17 +98,41 @@ fn parse_games(lines: Vec<String>) -> Vec<Game> {
|
|
|
games
|
|
|
}
|
|
|
|
|
|
+fn filter_games(games: Vec<Game>, max_red: i32, max_green: i32, max_blue: i32) -> Vec<Game> {
|
|
|
+ let mut filtered_games: Vec<Game> = Vec::new();
|
|
|
+ for game in games {
|
|
|
+ let mut valid: bool = true;
|
|
|
+ // Clone the game before entering the loop
|
|
|
+ let cloned_game: Game = game.clone();
|
|
|
+ for reveal in cloned_game.reveals {
|
|
|
+ if reveal.red > max_red || reveal.green > max_green || reveal.blue > max_blue {
|
|
|
+ valid = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if valid {
|
|
|
+ filtered_games.push(game);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ filtered_games
|
|
|
+}
|
|
|
+
|
|
|
fn main() {
|
|
|
let lines: Vec<String> = read_lines("input.txt");
|
|
|
|
|
|
let games: Vec<Game> = parse_games(lines);
|
|
|
|
|
|
+ let max_red: i32 = 12;
|
|
|
+ let max_green: i32 = 13;
|
|
|
+ let max_blue: i32 = 14;
|
|
|
+
|
|
|
+ let _games_filtered = filter_games(games, max_red, max_green, max_blue);
|
|
|
+
|
|
|
// println!("hallo world");
|
|
|
}
|
|
|
|
|
|
#[cfg(test)]
|
|
|
mod tests {
|
|
|
- use crate::{parse_game, parse_games, parse_reveal, parse_reveals, Game};
|
|
|
+ use crate::{filter_games, parse_game, parse_games, parse_reveal, parse_reveals, Game};
|
|
|
|
|
|
#[test]
|
|
|
fn test_parse_reveal_1() {
|
|
|
@@ -222,4 +246,38 @@ mod tests {
|
|
|
assert_eq!(game[1].id, 2);
|
|
|
assert_eq!(game[2].id, 3);
|
|
|
}
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn test_filter_games() {
|
|
|
+ // arrange
|
|
|
+ let mut v: Vec<String> = Vec::new();
|
|
|
+ v.push(String::from(
|
|
|
+ "Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green",
|
|
|
+ ));
|
|
|
+ v.push(String::from(
|
|
|
+ "Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue",
|
|
|
+ ));
|
|
|
+ v.push(String::from(
|
|
|
+ "Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red",
|
|
|
+ ));
|
|
|
+ v.push(String::from(
|
|
|
+ "Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red",
|
|
|
+ ));
|
|
|
+ v.push(String::from(
|
|
|
+ "Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green",
|
|
|
+ ));
|
|
|
+ let games: Vec<Game> = parse_games(v);
|
|
|
+ let max_red: i32 = 12;
|
|
|
+ let max_green: i32 = 13;
|
|
|
+ let max_blue: i32 = 14;
|
|
|
+
|
|
|
+ // act
|
|
|
+ let filtered_games = filter_games(games, max_red, max_green, max_blue);
|
|
|
+
|
|
|
+ // assert
|
|
|
+ assert_eq!(filtered_games.len(), 3);
|
|
|
+ assert_eq!(filtered_games[0].id, 1);
|
|
|
+ assert_eq!(filtered_games[1].id, 2);
|
|
|
+ assert_eq!(filtered_games[2].id, 5);
|
|
|
+ }
|
|
|
}
|