소스 검색

parse_game()

matze 2 년 전
부모
커밋
f6c1890cc4
1개의 변경된 파일61개의 추가작업 그리고 44개의 파일을 삭제
  1. 61 44
      src/main.rs

+ 61 - 44
src/main.rs

@@ -11,15 +11,15 @@ use std::fs::read_to_string;
 // Game 9: 3 green, 4 blue, 1 red; 3 blue, 12 green, 18 red; 7 green, 9 red, 8 blue; 2 blue, 10 red, 12 green; 4 blue, 1 red, 1 green; 4 blue, 6 green, 6 red
 // Game 10: 2 blue, 4 green, 2 red; 7 green, 4 red; 5 red, 8 green
 
-// fn read_lines(filename: &str) -> Vec<String> {
-//     let mut result: Vec<String> = Vec::new();
+fn read_lines(filename: &str) -> Vec<String> {
+    let mut result: Vec<String> = Vec::new();
 
-//     for line in read_to_string(filename).unwrap().lines() {
-//         result.push(line.to_string())
-//     }
+    for line in read_to_string(filename).unwrap().lines() {
+        result.push(line.to_string())
+    }
 
-//     result
-// }
+    result
+}
 
 struct Reveal {
     red: i32,
@@ -27,10 +27,10 @@ struct Reveal {
     blue: i32,
 }
 
-// struct Game {
-//     id: i32,
-//     reveals: Vec<Reveal>,
-// }
+struct Game {
+    id: i32,
+    reveals: Vec<Reveal>,
+}
 
 fn parse_reveal(s: &str) -> Reveal {
     // example: 1 blue, 10 green, 15 red
@@ -41,7 +41,7 @@ fn parse_reveal(s: &str) -> Reveal {
         blue: 0,
     };
 
-    for token in s.split(", ") {
+    for token in s.trim().split(", ") {
         if token == "" {
             continue;
         }
@@ -72,26 +72,19 @@ fn parse_reveals(s: &str) -> Vec<Reveal> {
     reveals
 }
 
-// fn parse_game(line: &str) -> Game {
-fn parse_game(line: &str) {
-    // let tokens: Vec<&str> = line.split(":").collect();
-    // let id_str: &str = tokens[0];
-    // let id: i32 = id_str.parse::<i32>().unwrap();
-
-    // let reveal: Reveal = Reveal {
-    //     red: 3,
-    //     green: 3,
-    //     blue: 3,
-    // };
-
-    // let mut reveals: Vec<Reveal> = Vec::new();
-    // reveals.push(reveal);
-
-    // let game: Game = Game {
-    //     id: id,
-    //     reveals: reveals,
-    // };
-    // game
+fn parse_game(line: &str) -> Game {
+    let tokens: Vec<&str> = line.split(":").collect();
+    let s: Vec<&str> = tokens[0].split(" ").collect();
+    let id_str: &str = s[1];
+    let id: i32 = id_str.parse::<i32>().unwrap();
+
+    let reveals: Vec<Reveal> = parse_reveals(tokens[1]);
+
+    let game: Game = Game {
+        id: id,
+        reveals: reveals,
+    };
+    game
 }
 
 // fn parse_games(lines: Vec<String>) -> Vec<Game> {
@@ -105,7 +98,7 @@ fn parse_game(line: &str) {
 // }
 
 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);
 
@@ -118,7 +111,7 @@ fn main() {
 
 #[cfg(test)]
 mod tests {
-    use crate::{parse_game, parse_reveal, parse_reveals};
+    use crate::{parse_game, parse_reveal, parse_reveals, Game};
 
     #[test]
     fn test_parse_reveal_1() {
@@ -147,9 +140,22 @@ mod tests {
         assert_eq!(reveal.blue, 1);
         assert_eq!(reveal.red, 15);
     }
-
     #[test]
     fn test_parse_reveal_3() {
+        // arrange
+        let s: &str = " 1 blue, 10 green, 15 red";
+
+        // act
+        let reveal = parse_reveal(s);
+
+        // assert
+        assert_eq!(reveal.green, 10);
+        assert_eq!(reveal.blue, 1);
+        assert_eq!(reveal.red, 15);
+    }
+
+    #[test]
+    fn test_parse_reveal_4() {
         // arrange
         let s: &str = "";
 
@@ -179,13 +185,24 @@ mod tests {
         assert_eq!(reveals[1].red, 1);
     }
 
-    // #[test]
-    // fn test_parse_game(){
-    //     //arrange
-    //     let s: &str = ""
-
-    //     //act
-
-    //     //assert
-    // }
+    #[test]
+    fn test_parse_game() {
+        //arrange
+        let s: &str = "Game 15: 8 blue, 3 green, 15 red; 13 red, 10 blue; 2 red";
+
+        //act
+        let game: Game = parse_game(s);
+
+        //assert
+        assert_eq!(game.id, 15);
+        assert_eq!(game.reveals[0].red, 15);
+        assert_eq!(game.reveals[0].blue, 8);
+        assert_eq!(game.reveals[0].green, 3);
+        assert_eq!(game.reveals[1].red, 13);
+        assert_eq!(game.reveals[1].green, 0);
+        assert_eq!(game.reveals[1].blue, 10);
+        assert_eq!(game.reveals[2].red, 2);
+        assert_eq!(game.reveals[2].blue, 0);
+        assert_eq!(game.reveals[2].green, 0);
+    }
 }