#include #include #include #include #include using namespace intcode; namespace { using Coord = std::pair; auto Compute(Machine machine, ValueType start) -> std::map { Coord here {0,0}; std::map paint {{here,start}}; ValueType dx {0}; ValueType dy {-1}; bool next_color = true; Run(machine, [&]() { return paint[here]; }, [&](auto o) { if (next_color) { paint[here] = o; } else { std::swap(dx, dy); (o ? dx : dy) *= -1; here.first += dx; here.second += dy; } next_color = !next_color; }); return paint; } auto Draw(std::ostream & out, std::map image) { ValueType minX = 0, maxX = 0, minY = 0, maxY = 0; for (auto&& [k, _] : image) { auto [x,y] = k; minX = std::min(minX, x); maxX = std::max(maxX, x); minY = std::min(minY, y); maxY = std::max(maxY, y); } for (ValueType y = minY; y <= maxY; y++) { for (ValueType x = minX; x <= maxX; x++) { out << (image[{x,y}] ? "▓" : "░"); } out << "\n"; } } } // namespace auto main() -> int { auto machine = Machine{ParseStream(std::cin)}; std::cout << "Part 1: " << Compute(machine, 0).size() << "\nPart 2\n"; Draw(std::cout, Compute(std::move(machine), 1)); }