|
|
@@ -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);
|
|
|
+ }
|
|
|
}
|