aocpp/2019/25.cpp

81 lines
2.0 KiB
C++

#include <algorithm>
#include <iostream>
#include <map>
#include <tuple>
#include <utility>
#include <vector>
#include <string_view>
#include <aocpp/Startup.hpp>
#include <intcode/intcode.hpp>
using namespace aocpp;
using namespace intcode;
namespace {
auto RunWithIO(
Machine m,
std::string const& input
) -> void
{
auto it = input.begin();
Run(m,
[&]() -> ValueType {
if (it < input.end()) { return *it++; }
throw std::runtime_error{"insufficient input"};
},
[&](ValueType o) { std::cout << char(o); });
}
auto Search(std::string & script)
{
unsigned prev = 0;
script += "west\n";
for (unsigned i = 1; i < 256; i++) {
unsigned curr = i ^ (i >> 1);
if (curr < prev) {
script += "take ";
} else {
script += "drop ";
}
switch (curr ^ prev) {
case (1<<0): script += "cake\n"; break;
case (1<<1): script += "sand\n"; break;
case (1<<2): script += "asterisk\n"; break;
case (1<<3): script += "ornament\n"; break;
case (1<<4): script += "festive hat\n"; break;
case (1<<5): script += "food ration\n"; break;
case (1<<6): script += "space heater\n"; break;
case (1<<7): script += "semiconductor\n"; break;
}
script += "west\n";
prev = curr;
}
}
} // namespace
auto main(int argc, char** argv) -> int {
std::string script =
"north\n" "take sand\n"
"north\n" "take space heater\n"
"east\n" "take semiconductor\n"
"west\n" "south\n" "south\n" "east\n" "take ornament\n"
"east\n" "east\n" "west\n" "west\n" "south\n" "take festive hat\n"
"east\n" "take asterisk\n"
"south\n" "east\n" "take cake\n"
"east\n" /* electromagnet */ "south\n" "north\n" "west\n"
"west\n" "west\n" "take food ration\n"
"east\n" "north\n" "west\n"
"west\n" /* photons */
"east\n" "north\n" "west\n"
"west\n" /* molten lava */ "west\n" "east\n" "north\n" /* infinite loop */ "north\n";
Search(script);
RunWithIO(Machine{ParseStream(*aocpp::Startup(argc, argv))}, script);
}