81 lines
2.0 KiB
C++
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);
|
||
|
}
|