aocpp/day11.cpp
Eric Mertens 8c6d8d4a29 white
2022-11-04 11:37:32 -07:00

64 lines
1.4 KiB
C++

#include <iostream>
#include <utility>
#include <tuple>
#include <map>
#include <intcode/intcode.hpp>
using namespace intcode;
namespace {
using Coord = std::pair<ValueType, ValueType>;
auto Compute(Machine machine, ValueType start)
-> std::map<Coord, ValueType> {
Coord here {0,0};
std::map<Coord, ValueType> 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<Coord, ValueType> 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));
}