From 318243ccea72fb049254cde7e86036bf0d81bd7e Mon Sep 17 00:00:00 2001 From: Matthew Gretton-Dann Date: Fri, 10 Dec 2021 10:16:46 +0000 Subject: [PATCH] Add 2021 day 10 puzzles --- 2021/puzzle-10-01.cc | 40 ++++++++++++++++++++++++++++++ 2021/puzzle-10-02.cc | 59 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 2021/puzzle-10-01.cc create mode 100644 2021/puzzle-10-02.cc diff --git a/2021/puzzle-10-01.cc b/2021/puzzle-10-01.cc new file mode 100644 index 0000000..4df28da --- /dev/null +++ b/2021/puzzle-10-01.cc @@ -0,0 +1,40 @@ +// +// Created by Matthew Gretton-Dann on 10/12/2021. +// + +#include +#include +#include +#include +#include + +auto main() -> int +{ + std::map matches{{'(', ')'}, {'[', ']'}, {'{', '}'}, {'<', '>'}}; + std::map scores{{')', 3}, {']', 57}, {'}', 1197}, {'>', 25137}}; + + std::string line; + unsigned score{0}; + while (std::getline(std::cin, line)) { + std::stack expecting; + for (auto c : line) { + if (auto it = matches.find(c); it != matches.end()) { + expecting.push(it->second); + } + else if (!expecting.empty()) { + if (c == expecting.top()) { + expecting.pop(); + } + else { + auto score_it{scores.find(c)}; + assert(score_it != scores.end()); + score += score_it->second; + break; + } + } + } + } + + std::cout << "Total score: " << score << '\n'; + return 0; +} diff --git a/2021/puzzle-10-02.cc b/2021/puzzle-10-02.cc new file mode 100644 index 0000000..3020f15 --- /dev/null +++ b/2021/puzzle-10-02.cc @@ -0,0 +1,59 @@ +// +// Created by Matthew Gretton-Dann on 10/12/2021. +// + +#include +#include +#include +#include +#include +#include + +auto main() -> int +{ + std::map matches{{'(', ')'}, {'[', ']'}, {'{', '}'}, {'<', '>'}}; + std::map scores{{')', 1}, {']', 2}, {'}', 3}, {'>', 4}}; + + std::string line; + std::vector line_scores; + while (std::getline(std::cin, line)) { + bool incomplete{true}; + std::stack expecting; + for (auto c : line) { + if (auto it = matches.find(c); it != matches.end()) { + expecting.push(it->second); + } + else if (!expecting.empty()) { + if (c == expecting.top()) { + expecting.pop(); + } + else { + incomplete = false; + break; + } + } + else { + abort(); + } + } + + if (!incomplete) { + continue; + } + + // expecting has the characters we expect. + std::uint64_t score{0}; + while (!expecting.empty()) { + score *= 5; + auto score_it{scores.find(expecting.top())}; + assert(score_it != scores.end()); + score += score_it->second; + expecting.pop(); + } + line_scores.push_back(score); + } + + std::sort(line_scores.begin(), line_scores.end()); + std::cout << "Middle score: " << line_scores.at(line_scores.size() / 2) << '\n'; + return 0; +}