]> code.bitgloo.com Git - clyne/advent-of-code.git/commitdiff
add day 9 (c++)
authorClyne Sullivan <clyne@bitgloo.com>
Fri, 9 Dec 2022 08:35:07 +0000 (03:35 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Fri, 9 Dec 2022 08:35:07 +0000 (03:35 -0500)
day9/part1.cpp [new file with mode: 0644]
day9/part2.cpp [new file with mode: 0644]

diff --git a/day9/part1.cpp b/day9/part1.cpp
new file mode 100644 (file)
index 0000000..ecfbdd6
--- /dev/null
@@ -0,0 +1,55 @@
+#include <algorithm>
+#include <iostream>
+#include <list>
+#include <string>
+#include <tuple>
+#include <vector>
+
+int main()
+{
+    std::vector<std::pair<char, int>> steps;
+
+    while (1) {
+        std::string line;
+        std::getline(std::cin, line);
+        if (std::cin.eof())
+            break;
+
+        steps.emplace_back(line.front(), stoi(line.substr(2)));
+    }
+
+    int hx = 0, hy = 0, tx = 0, ty = 0;
+    std::list<std::pair<int, int>> locs;
+    locs.emplace_back(0, 0);
+
+    for (const auto& [dir, count] : steps) {
+        for (int i = 0; i < count; ++i) {
+            //std::cout << hx << ", " << hy << "    " << tx << ", " << ty << std::endl;
+
+            if (dir == 'U')
+                ++hy;
+            else if (dir == 'D')
+                --hy;
+            else if (dir == 'R')
+                ++hx;
+            else if (dir == 'L')
+                --hx;
+
+            if (std::abs(hx - tx) > 1 || std::abs(hy - ty) > 1) {
+                if (hx != tx)
+                    tx += hx > tx ? 1 : -1;
+                if (hy != ty)
+                    ty += hy > ty ? 1 : -1;
+
+                if (std::find(locs.cbegin(), locs.cend(), std::pair{tx, ty}) == locs.cend()) {
+                    locs.emplace_back(tx, ty);
+                }
+            }
+        }
+    }
+
+    std::cout << locs.size() << std::endl;
+
+    return 0;
+}
+
diff --git a/day9/part2.cpp b/day9/part2.cpp
new file mode 100644 (file)
index 0000000..d6da81b
--- /dev/null
@@ -0,0 +1,59 @@
+#include <algorithm>
+#include <iostream>
+#include <list>
+#include <string>
+#include <tuple>
+#include <vector>
+
+int main()
+{
+    std::vector<std::pair<char, int>> steps;
+
+    while (1) {
+        std::string line;
+        std::getline(std::cin, line);
+        if (std::cin.eof())
+            break;
+
+        steps.emplace_back(line.front(), stoi(line.substr(2)));
+    }
+
+    std::vector<std::pair<int, int>> knots (10, {0, 0});
+    std::list<std::pair<int, int>> locs;
+    locs.emplace_back(0, 0);
+
+    for (const auto& [dir, count] : steps) {
+        for (int i = 0; i < count; ++i) {
+            auto& [x0, y0] = knots[0];
+
+            if (dir == 'U')
+                ++y0;
+            else if (dir == 'D')
+                --y0;
+            else if (dir == 'R')
+                ++x0;
+            else if (dir == 'L')
+                --x0;
+
+            for (int j = 1; j < knots.size(); ++j) {
+                auto& [hx, hy] = knots[j - 1];
+                auto& [tx, ty] = knots[j];
+
+                if (std::abs(hx - tx) > 1 || std::abs(hy - ty) > 1) {
+                    if (hx != tx)
+                        tx += hx > tx ? 1 : -1;
+                    if (hy != ty)
+                        ty += hy > ty ? 1 : -1;
+                }
+
+                if (std::find(locs.cbegin(), locs.cend(), knots.back()) == locs.cend())
+                    locs.emplace_back(knots.back());
+            }
+        }
+    }
+
+    std::cout << locs.size() << std::endl;
+
+    return 0;
+}
+