-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbraces.rs
70 lines (63 loc) · 1.3 KB
/
braces.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
use std::io;
use std::io::BufRead as _;
fn check_match(x: char, stack: &Vec<char>) -> bool {
let y = match stack.last() {
Some(value) => *value,
None => return false
};
match x {
')' => return y == '(',
']' => return y == '[',
'}' => return y == '{',
'>' => return y == '<',
_ => panic!("ass!"),
}
}
fn main() {
let mut p1 = 0;
let mut p2vec = vec![];
for line in io::BufReader::new(io::stdin()).lines() {
let mut stack: Vec<char> = vec![];
let mut line_corrupted = false;
for c in line.unwrap().chars() {
match c {
'(' | '[' | '{' | '<' => { stack.push(c); },
')' | ']' | '}' | '>' => {
if check_match(c, &stack) {
stack.pop();
} else {
p1 += match c {
')' => 3,
']' => 57,
'}' => 1197,
'>' => 25137,
_ => panic!("crap!")
};
line_corrupted = true;
break;
}
},
_ => panic!("shite!"),
}
}
// A line can be either corrupted or incomplete, but not both
if line_corrupted {
continue;
}
let mut p2: usize = 0;
while let Some(c) = stack.pop() {
p2 *= 5;
p2 += match c {
'(' => 1,
'[' => 2,
'{' => 3,
'<' => 4,
_ => panic!("shitnugget!"),
}
}
p2vec.push(p2);
}
println!("Part1: {}", p1);
p2vec.sort();
println!("Part2: {}", p2vec[p2vec.len() / 2]);
}