| #include <iostream> |
| #include <vector> |
| #include <string> |
| #include <cmath> |
| #include <algorithm> |
|
|
| struct Instruction { |
| std::string type; |
| int a, x, b, y; |
| }; |
|
|
| int main() { |
| std::ios_base::sync_with_stdio(false); |
| std::cin.tie(NULL); |
|
|
| unsigned int k_unsigned; |
| std::cin >> k_unsigned; |
| long long k = k_unsigned; |
|
|
| if (k == 1) { |
| std::cout << 1 << std::endl; |
| std::cout << "HALT PUSH 1 GOTO 1" << std::endl; |
| return 0; |
| } |
|
|
| long long h = (k - 1) / 2; |
| int L = (h == 0) ? -1 : static_cast<int>(floor(log2(h))); |
|
|
| std::vector<Instruction> prog; |
|
|
| |
| prog.push_back({"POP", 999, 0, 1000, 0}); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| for (int i = L; i >= 0; --i) { |
| int S_i = i + 1; |
| int D_i = i + 1 + 32; |
| int A_i = i + 1 + 64; |
|
|
| int next_S = (i > 0) ? i : prog.size() + 3 * (L + 1) + 2; |
|
|
| |
| prog.push_back({"POP", D_i, 3 * (L - i) + 4, A_i, next_S}); |
| |
| prog.push_back({"POP", S_i, 3 * (L - i) + 2, D_i, 3 * (L - i) + 2}); |
| |
| prog.push_back({"POP", S_i, 3 * (L - i) + 3, S_i, 3 * (L - i) + 4}); |
| } |
|
|
| |
| prog[0].y = 2; |
| |
| if ((h >> L) & 1) { |
| prog[1].b = L + 1 + 64; |
| } else { |
| prog[1].b = L + 1 + 32; |
| } |
| prog[1].x = 3 * (L - L) + 2; |
| prog[1].y = 3 * (L - L) + 2; |
| |
| |
| for (int i = L; i > 0; --i) { |
| if ((h >> (i - 1)) & 1) { |
| prog[3 * (L - i) + 2].y = 3 * (L - (i - 1)) + 3; |
| } else { |
| prog[3 * (L - i) + 2].y = 3 * (L - (i - 1)) + 4; |
| } |
| } |
| |
| |
| |
| int popper_pc = prog.size() + 1; |
| for (int i = 0; i <= L; ++i) { |
| prog.push_back({"POP", i + 1, popper_pc, 0, popper_pc}); |
| prog.push_back({"POP", i + 1 + 32, popper_pc, 0, popper_pc}); |
| prog.push_back({"POP", i + 1 + 64, popper_pc, 0, popper_pc}); |
| } |
| prog.push_back({"POP", 1000, prog.size() + 2, 0, popper_pc}); |
|
|
| |
| prog.push_back({"HALT", 0, 0, 999, 999}); |
|
|
| std::cout << prog.size() << std::endl; |
| for (const auto& p : prog) { |
| if (p.type == "HALT") { |
| std::cout << "HALT PUSH " << p.b << " GOTO " << p.y << std::endl; |
| } else { |
| std::cout << "POP " << p.a << " GOTO " << p.x << " PUSH " << p.b << " GOTO " << p.y << std::endl; |
| } |
| } |
|
|
| return 0; |
| } |