aocpp/2019/25.cpp
2023-01-31 09:44:30 -08:00

82 lines
1.9 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 intcode;
namespace {
auto RunWithIO(
std::ostream & out,
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) { out << 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(std::istream & in, std::ostream & out) -> void
{
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(out, Machine{ParseStream(in)}, script);
}