Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
epidemian
GitHub Repository: epidemian/advent-of-code-2021
Path: blob/main/src/day10.rs
97 views
1
pub fn run() {
2
let mut corrupted_chars = vec![];
3
let mut unclosed_brackets = vec![];
4
5
for line in include_str!("inputs/day10").lines() {
6
match analyze_line(line) {
7
Ok(Incomplete { unclosed }) => unclosed_brackets.push(unclosed),
8
Err(Corrupted(ch)) => corrupted_chars.push(ch),
9
}
10
}
11
12
let syntax_error_score: i32 = corrupted_chars
13
.iter()
14
.map(|ch| match ch {
15
')' => 3,
16
']' => 57,
17
'}' => 1197,
18
'>' => 25137,
19
_ => unreachable!(),
20
})
21
.sum();
22
println!("{}", syntax_error_score);
23
24
let mut autocomplete_scores: Vec<i64> = unclosed_brackets
25
.iter()
26
.map(|unclosed| {
27
unclosed
28
.iter()
29
.rev()
30
.map(|ch| match ch {
31
'(' => 1,
32
'[' => 2,
33
'{' => 3,
34
'<' => 4,
35
_ => unreachable!(),
36
})
37
.fold(0, |acc, val| acc * 5 + val)
38
})
39
.collect();
40
autocomplete_scores.sort();
41
println!("{:?}", autocomplete_scores[autocomplete_scores.len() / 2]);
42
}
43
44
struct Corrupted(char);
45
struct Incomplete {
46
unclosed: Vec<char>,
47
}
48
49
fn analyze_line(line: &str) -> Result<Incomplete, Corrupted> {
50
let mut unclosed_brackets = vec![];
51
for ch in line.chars() {
52
match ch {
53
'(' | '[' | '{' | '<' => unclosed_brackets.push(ch),
54
')' | ']' | '}' | '>' => {
55
let open_char = match ch {
56
')' => '(',
57
']' => '[',
58
'}' => '{',
59
'>' => '<',
60
_ => unreachable!(),
61
};
62
match unclosed_brackets.last() {
63
None => return Err(Corrupted(ch)),
64
Some(&unclosed_ch) => {
65
if unclosed_ch == open_char {
66
unclosed_brackets.pop();
67
} else {
68
return Err(Corrupted(ch));
69
}
70
}
71
}
72
}
73
_ => unreachable!(),
74
}
75
}
76
Ok(Incomplete {
77
unclosed: unclosed_brackets,
78
})
79
}
80
81