diff --git a/day9/part1.cpp b/day9/part1.cpp new file mode 100644 index 0000000..ecfbdd6 --- /dev/null +++ b/day9/part1.cpp @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include +#include + +int main() +{ + std::vector> 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> 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 index 0000000..d6da81b --- /dev/null +++ b/day9/part2.cpp @@ -0,0 +1,59 @@ +#include +#include +#include +#include +#include +#include + +int main() +{ + std::vector> 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> knots (10, {0, 0}); + std::list> 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; +} +