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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
use std::fs;
enum Color {
Red,
Blue,
Green
}
const GREENMAX: u32 = 13;
const REDMAX: u32 = 12;
const BLUEMAX: u32 = 14;
fn main() {
let f = fs::read_to_string("input").unwrap();
let mut count = 0;
let mut count2 = 0;
for line in f.split("\n") {
// Separate game number and data
let colonidx = line.find(':').unwrap();
let (game, data) = line.split_at(colonidx);
// Get game number
let game: Vec<&str> = game.split_whitespace().collect();
let game = game.get(game.len() - 1).unwrap();
let game: u32 = game.parse().unwrap();
println!("{}", game);
// Separate game data
let data = data.replace(':', "");
let data: Vec<(u32, Vec<(u32, Color)>)> = data.split(";").map(|x| {
// Separate game rolls
let x: Vec<&str> = x.split(",").collect();
let mut fin = (game, vec![]);
for roll in x {
let mut roll = roll.split_whitespace();
let amount: u32 = roll.next().unwrap().parse().unwrap();
let color = match roll.next().unwrap() {
"blue" => Color::Blue,
"red" => Color::Red,
"green" => Color::Green,
_ => panic!(),
};
fin.1.push((amount, color));
}
return fin;
}).collect();
// let mut count = 0;
// println!("process data");
let mut failed = false;
let mut game = 0;
let mut red = 0;
let mut green = 0;
let mut blue = 0;
for entry in data {
game = entry.0;
for e in entry.1 {
match e.1 {
Color::Blue => {
if e.0 > blue {
// println!("{}", e.0);
blue = e.0;
}
if e.0 > BLUEMAX {
failed = true;
}
},
Color::Green => {
if e.0 > green {
green = e.0;
}
if e.0 > GREENMAX {
failed = true;
}
},
Color::Red => {
if e.0 > red {
red = e.0;
}
if e.0 > REDMAX {
failed = true;
}
},
}
}
}
// println!("{}", red * green * blue);
count2 += red * green * blue;
if failed == false {
// println!("one");
count += game;
}
println!("\n");
}
println!("\npart one:{}", count);
println!("part two:{}", count2);
}
|