aboutsummaryrefslogtreecommitdiff
path: root/2021/day10/day10.cpp
diff options
context:
space:
mode:
authorjacopograndi <jacopo.grandi@outlook.it>2022-01-07 12:15:26 +0100
committerjacopograndi <jacopo.grandi@outlook.it>2022-01-07 12:15:26 +0100
commit0cadb2319cf7b937918df7071a810d28d769a465 (patch)
tree66f8c49f584954eab951d4a9e2b5d9e0424da9d4 /2021/day10/day10.cpp
parent6f96b2014b053a2e6e5a37464ca6fc578607fda7 (diff)
day09 & day10
Diffstat (limited to '2021/day10/day10.cpp')
-rw-r--r--2021/day10/day10.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/2021/day10/day10.cpp b/2021/day10/day10.cpp
new file mode 100644
index 0000000..4fad4ca
--- /dev/null
+++ b/2021/day10/day10.cpp
@@ -0,0 +1,88 @@
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <stack>
+#include <string>
+#include <algorithm>
+
+#include "../utils.h"
+
+char map (char a) {
+ if (a == '(') return ')';
+ if (a == '[') return ']';
+ if (a == '{') return '}';
+ if (a == '<') return '>';
+ return 'A';
+}
+
+bool match (char a, char b) {
+ if (a == '(' && b == ')') return true;
+ if (a == '[' && b == ']') return true;
+ if (a == '{' && b == '}') return true;
+ if (a == '<' && b == '>') return true;
+ return false;
+}
+
+int score (char a) {
+ if (a == ')') return 3;
+ if (a == ']') return 57;
+ if (a == '}') return 1197;
+ if (a == '>') return 25137;
+ return 0;
+}
+
+long score (std::string str) {
+ long s = 0;
+ for (char c : str) {
+ s *= 5;
+ s += (c == ')' ? 1 : 0);
+ s += (c == ']' ? 2 : 0);
+ s += (c == '}' ? 3 : 0);
+ s += (c == '>' ? 4 : 0);
+ }
+ return s;
+}
+
+bool check (std::string line, std::string &out) {
+ std::stack<char> stack;
+ for (char c : line) {
+ if (c == '(' || c == '[' || c == '{' || c == '<') {
+ stack.push(c);
+ } else {
+ if (!match(stack.top(), c)) {
+ out.push_back(c);
+ return true;
+ } else stack.pop();
+ }
+ }
+ while (!stack.empty()) {
+ out.push_back(map(stack.top()));
+ stack.pop();
+ }
+ return false;
+}
+
+int main (int argc, char *argv[]) {
+ std::string raw;
+ std::getline(std::ifstream(argv[1]), raw, '\0');
+ std::vector<std::string> lines;
+ split(lines, raw, "\n");
+
+ std::vector<long> repairs;
+ int sum = 0;
+ for (auto line : lines) {
+ if (line.size() == 0) continue;
+ std::string rep;
+ bool corrupt = check(line, rep);
+ if (corrupt) sum += score(rep[0]);
+ else {
+ repairs.push_back(score(rep));
+ std::cout << score(rep) << " " << rep << std::endl;
+ }
+ }
+ std::cout << "corrupt score: " << sum << std::endl;
+ std::sort(std::begin(repairs), std::end(repairs));
+ std::cout << "repairs score: " << repairs[(repairs.size()-1)/2] << std::endl;
+
+ return 0;
+}