summaryrefslogtreecommitdiffstats
path: root/2021/day10/src/main.rs
diff options
context:
space:
mode:
authorYigit Sever2021-12-20 16:56:51 +0300
committerYigit Sever2021-12-20 16:56:51 +0300
commitca60384d831d1208227b3538ca121ebc4624b0f2 (patch)
treefae54d59ecd77c513ba149e9c89e72e6d368720d /2021/day10/src/main.rs
parent3621b8231a603854e6c088df2879bae02e62681d (diff)
downloadaoc-ca60384d831d1208227b3538ca121ebc4624b0f2.tar.gz
aoc-ca60384d831d1208227b3538ca121ebc4624b0f2.tar.bz2
aoc-ca60384d831d1208227b3538ca121ebc4624b0f2.zip
2021, day10: done
Diffstat (limited to '2021/day10/src/main.rs')
-rw-r--r--2021/day10/src/main.rs65
1 files changed, 65 insertions, 0 deletions
diff --git a/2021/day10/src/main.rs b/2021/day10/src/main.rs
new file mode 100644
index 0000000..dcb44a8
--- /dev/null
+++ b/2021/day10/src/main.rs
@@ -0,0 +1,65 @@
1use std::collections::HashMap;
2use std::env;
3use std::fs::File;
4use std::io::{BufRead, BufReader};
5
6fn main() {
7 let reader = open_file();
8 let points = HashMap::from([(')', 3), (']', 57), ('}', 1197), ('>', 25137)]);
9 let comp_points = HashMap::from([(')', 1), (']', 2), ('}', 3), ('>', 4)]);
10 let pairs = HashMap::from([('(', ')'), ('[', ']'), ('{', '}'), ('<', '>')]);
11 let opening = vec!['(', '[', '{', '<'];
12 let closing = vec![')', ']', '}', '>'];
13 let mut final_scores = Vec::new();
14
15 let mut score = 0;
16
17 for line in reader.lines() {
18 let mut stack: Vec<char> = Vec::new();
19 let mut flag = false;
20 if let Ok(ln) = line {
21 for char in ln.chars() {
22 if opening.contains(&char) {
23 stack.push(char);
24 } else if closing.contains(&char) {
25 let t = stack.pop().unwrap();
26 if char == *pairs.get(&t).unwrap() {
27 } else {
28 score += points.get(&char).unwrap();
29 flag = true;
30 break;
31 }
32 }
33 }
34 if !flag {
35 let mut score: u64 = 0;
36 stack.reverse();
37 for c in &stack {
38 score *= 5;
39 score += comp_points.get(pairs.get(c).unwrap()).unwrap();
40 }
41 final_scores.push(score);
42 }
43 }
44 }
45
46 final_scores.sort_unstable();
47 let idx = final_scores.len() / 2;
48
49 println!("part 1: {}", score);
50 println!("part 2: {}", final_scores[idx]);
51}
52
53fn open_file() -> BufReader<File> {
54 let args: Vec<String> = env::args().collect();
55
56 if args.len() != 2 {
57 eprintln!("Usage: {} <filename>", args[0]);
58 std::process::exit(1);
59 }
60
61 let filename = &args[1];
62
63 let file = File::open(filename).unwrap_or_else(|_| panic!("No such file: {}", filename));
64 BufReader::new(file)
65}