19
This commit is contained in:
parent
3337b9f536
commit
c3b3de5416
52
2019/19.cpp
Normal file
52
2019/19.cpp
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <aocpp/Coord.hpp>
|
||||||
|
#include <aocpp/Startup.hpp>
|
||||||
|
#include <intcode/intcode.hpp>
|
||||||
|
|
||||||
|
using namespace aocpp;
|
||||||
|
using namespace intcode;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class Scanner {
|
||||||
|
Machine machine_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Scanner(Machine machine) : machine_{std::move(machine)} {}
|
||||||
|
|
||||||
|
auto operator()(ValueType x, ValueType y) const -> bool {
|
||||||
|
Machine m {machine_};
|
||||||
|
StepInput(m, x);
|
||||||
|
StepInput(m, y);
|
||||||
|
return StepOutput(m);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
auto Part1(Scanner const& scanner) {
|
||||||
|
std::int64_t count {};
|
||||||
|
for (std::int64_t y = 0; y < 50; y++) {
|
||||||
|
for (std::int64_t x = 0; x < 50; x++) {
|
||||||
|
if (scanner(x, y)) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto Part2(Scanner const& scanner) {
|
||||||
|
ValueType x = 0;
|
||||||
|
for(ValueType y = 99;; y++){
|
||||||
|
for (; !scanner(x, y); x++);
|
||||||
|
if (scanner(x+99,y-99)) { return 10000 * x + y-99; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
auto main(int argc, char** argv) -> int {
|
||||||
|
auto scanner = Scanner{Machine{ParseStream(aocpp::Startup(argc, argv))}};
|
||||||
|
std::cout << "Part 1: " << Part1(scanner) << std::endl;
|
||||||
|
std::cout << "Part 2: " << Part2(scanner) << std::endl;
|
||||||
|
}
|
|
@ -49,6 +49,9 @@ target_link_libraries(17 aocpp intcode)
|
||||||
add_executable(18 18.cpp)
|
add_executable(18 18.cpp)
|
||||||
target_link_libraries(18 aocpp)
|
target_link_libraries(18 aocpp)
|
||||||
|
|
||||||
|
add_executable(19 19.cpp)
|
||||||
|
target_link_libraries(19 aocpp intcode)
|
||||||
|
|
||||||
add_executable(20 20.cpp)
|
add_executable(20 20.cpp)
|
||||||
target_link_libraries(20 aocpp)
|
target_link_libraries(20 aocpp)
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ public:
|
||||||
/// @param address
|
/// @param address
|
||||||
/// @return reference to memory at given address
|
/// @return reference to memory at given address
|
||||||
auto At(std::size_t address) -> ValueType &;
|
auto At(std::size_t address) -> ValueType &;
|
||||||
|
auto At(std::size_t address) const -> ValueType;
|
||||||
|
|
||||||
/// Access memory at address relative to base pointer
|
/// Access memory at address relative to base pointer
|
||||||
/// @param offset from base pointer
|
/// @param offset from base pointer
|
||||||
|
|
|
@ -11,6 +11,12 @@ auto Machine::At(std::size_t const i) -> ValueType & {
|
||||||
return i < rom_.size() ? rom_[i] : ram_[i];
|
return i < rom_.size() ? rom_[i] : ram_[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto Machine::At(std::size_t const i) const -> ValueType {
|
||||||
|
if (i < rom_.size()) return rom_[i];
|
||||||
|
if (auto it = ram_.find(i); it != ram_.end()) { return it->second; }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
auto Machine::Rel(std::size_t const i) -> ValueType & {
|
auto Machine::Rel(std::size_t const i) -> ValueType & {
|
||||||
return At(base_ + i);
|
return At(base_ + i);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user