Browse Source

filter_games()

matze 2 years ago
parent
commit
3626860ca2
1 changed files with 61 additions and 3 deletions
  1. 61 3
      src/main.rs

+ 61 - 3
src/main.rs

@@ -21,13 +21,13 @@ fn read_lines(filename: &str) -> Vec<String> {
 
 
     result
     result
 }
 }
-
+#[derive(Clone)]
 struct Reveal {
 struct Reveal {
     red: i32,
     red: i32,
     green: i32,
     green: i32,
     blue: i32,
     blue: i32,
 }
 }
-
+#[derive(Clone)]
 struct Game {
 struct Game {
     id: i32,
     id: i32,
     reveals: Vec<Reveal>,
     reveals: Vec<Reveal>,
@@ -98,17 +98,41 @@ fn parse_games(lines: Vec<String>) -> Vec<Game> {
     games
     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() {
 fn main() {
     let lines: Vec<String> = read_lines("input.txt");
     let lines: Vec<String> = read_lines("input.txt");
 
 
     let games: Vec<Game> = parse_games(lines);
     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");
     // println!("hallo world");
 }
 }
 
 
 #[cfg(test)]
 #[cfg(test)]
 mod tests {
 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]
     #[test]
     fn test_parse_reveal_1() {
     fn test_parse_reveal_1() {
@@ -222,4 +246,38 @@ mod tests {
         assert_eq!(game[1].id, 2);
         assert_eq!(game[1].id, 2);
         assert_eq!(game[2].id, 3);
         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);
+    }
 }
 }