#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}; for (;;) { auto effect = machine.Step(); if (std::holds_alternative(effect)) { return paint; } std::get(effect).pos = paint[here]; paint[here] = std::get(machine.Step()).val; auto dir = std::get(machine.Step()).val; std::swap(dx, dy); if (dir) { dx = -dx; } else { dy = -dy; } here.first += dx; here.second += dy; } } 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)); }