2022-11-03 08:15:17 -07:00
|
|
|
#include <iostream>
|
|
|
|
#include <utility>
|
|
|
|
|
2022-11-13 11:42:40 -08:00
|
|
|
#include <doctest.h>
|
|
|
|
|
2022-11-06 21:12:30 -08:00
|
|
|
#include <aocpp/Startup.hpp>
|
2022-11-04 09:38:01 -07:00
|
|
|
#include <intcode/intcode.hpp>
|
2022-11-03 08:15:17 -07:00
|
|
|
|
2022-11-13 11:42:40 -08:00
|
|
|
|
2022-11-03 12:53:10 -07:00
|
|
|
using namespace intcode;
|
|
|
|
|
2022-11-03 08:15:17 -07:00
|
|
|
namespace {
|
|
|
|
|
2022-11-03 14:43:47 -07:00
|
|
|
auto Compute(Machine machine, ValueType x, ValueType y) {
|
|
|
|
machine.At(1) = x;
|
|
|
|
machine.At(2) = y;
|
2022-11-04 08:29:02 -07:00
|
|
|
Step(machine);
|
2022-11-03 14:43:47 -07:00
|
|
|
return machine.At(0);
|
2022-11-03 08:15:17 -07:00
|
|
|
}
|
|
|
|
|
2022-11-03 12:53:10 -07:00
|
|
|
} // namespace
|
2022-11-03 08:15:17 -07:00
|
|
|
|
2022-11-13 11:42:40 -08:00
|
|
|
TEST_SUITE("documented examples") {
|
|
|
|
|
|
|
|
auto eval = [](std::vector<ValueType> program, std::vector<ValueType> output) {
|
|
|
|
Machine m{program};
|
|
|
|
REQUIRE(std::holds_alternative<Halt>(Step(m)));
|
|
|
|
REQUIRE(m.Dump() == output);
|
|
|
|
};
|
|
|
|
|
|
|
|
TEST_CASE("part 1") {
|
|
|
|
eval({1,0,0,0,99}, {2,0,0,0,99});
|
|
|
|
eval({2,3,0,3,99}, {2,3,0,6,99});
|
|
|
|
eval({2,4,4,5,99,0}, {2,4,4,5,99,9801});
|
|
|
|
eval({1,1,1,4,99,5,6,0,99}, {30,1,1,4,2,5,6,0,99});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-06 11:33:20 -08:00
|
|
|
auto main(int argc, char** argv) -> int {
|
2022-11-21 18:49:22 -08:00
|
|
|
auto machine = Machine{ParseStream(*aocpp::Startup(argc, argv))};
|
2022-11-03 08:15:17 -07:00
|
|
|
|
2022-11-03 14:43:47 -07:00
|
|
|
std::cout << "Part 1: " << Compute(machine, 12, 2) << std::endl;
|
2022-11-03 08:15:17 -07:00
|
|
|
|
2022-11-03 12:53:10 -07:00
|
|
|
for (std::int64_t i = 0; i < 100; i++) {
|
|
|
|
for (std::int64_t j = 0; j < 100; j++) {
|
2022-11-03 14:43:47 -07:00
|
|
|
if (19690720 == Compute(machine, i, j)) {
|
2022-11-03 12:53:10 -07:00
|
|
|
std::cout << "Part 2: " << 100 * i + j << std::endl;
|
|
|
|
}
|
2022-11-03 08:15:17 -07:00
|
|
|
}
|
2022-11-03 12:53:10 -07:00
|
|
|
}
|
|
|
|
}
|