-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday_2.rs
97 lines (77 loc) · 2.23 KB
/
day_2.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use crate::safe_unpack;
#[derive(PartialEq, Debug)]
pub struct Game {
id: u32,
red: u32,
green: u32,
blue: u32,
}
pub fn parse(input_raw: &str) -> Result<Vec<Game>, String> {
let lines = input_raw.lines();
let mut games: Vec<Game> = vec![];
for line in lines {
safe_unpack!(line.split(": "), id, game_str);
let mut game = Game {
id: id.split_ascii_whitespace().last().unwrap().parse().unwrap(),
red: 0,
green: 0,
blue: 0,
};
let game_str = game_str.replace("; ", ", ");
let game_properties = game_str.split(", ");
for property in game_properties {
safe_unpack!(property.split_ascii_whitespace(), count, color);
let count: u32 = match count.parse() {
Ok(c) => c,
Err(e) => return Err(format!("{e:?} - '{count}'")),
};
if color == "red" && count > game.red {
game.red = count;
}
if color == "green" && count > game.green {
game.green = count;
}
if color == "blue" && count > game.blue {
game.blue = count;
}
}
games.push(game);
}
Ok(games)
}
pub fn part_one(games: &[Game]) -> Result<u32, String> {
let total = games.iter().fold(0, |total, game| {
total
+ if game.red > 12 || game.green > 13 || game.blue > 14 {
0
} else {
game.id
}
});
Ok(total)
}
pub fn part_two(games: &[Game]) -> Result<u32, String> {
let power_sum = games
.iter()
.map(|game| game.red * game.green * game.blue)
.sum();
Ok(power_sum)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part1() {
let example = include_str!("../../examples/day_2_1.txt");
let parsed = parse(example).unwrap();
let result = part_one(&parsed);
assert_eq!(result, Ok(8));
}
#[test]
fn test_part2() {
let example = include_str!("../../examples/day_2_1.txt");
let parsed = parse(example).unwrap();
let result = part_two(&parsed);
assert_eq!(result, Ok(2286));
}
}