#include #include #include #include #include #include #include using namespace std; unordered_set visited_by_original; unordered_set visited; vector> program; optional run(int pc = 0, int acc = 0, bool original = true) { int part_2_solution; while (original && !visited_by_original.count(pc) || !visited.count(pc)) { if (original) visited_by_original.insert(pc); visited.insert(pc); if (pc >= program.size()) return acc; auto instruction = program[pc]; if (instruction.first == 'a') acc += instruction.second; else if (original) { auto changed_result = run(pc + (instruction.first == 'j' ? 1 : instruction.second), acc, false); if (changed_result.has_value()) part_2_solution = changed_result.value(); } pc += instruction.first == 'j' ? instruction.second : 1; } if (original) cout << "part 1: " << acc << endl << "part 2: " << part_2_solution << endl; return {}; } int main() { auto split = [](string in, string delim) { vector result; while (true) { auto pos = in.find(delim); result.push_back(in.substr(0, pos)); in = in.substr(pos == string::npos ? in.length() : pos + delim.length()); if (!in.length()) return result; } }; for (auto& line : split(string(istreambuf_iterator(ifstream("input-8.txt").rdbuf()), istreambuf_iterator()), "\n")) if(line.length()) program.push_back(make_pair(line[0], stoi(line.substr(4)))); run(); system("pause"); return 0; }