Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <stack>
- #include <cstring>
- struct Program {
- std::stack<int> stack;
- char source[25][81] = {{0}};
- int x = 0, y = 0, dx = 1, dy = 0;
- bool finished = false;
- void move() {
- x = (x + dx + 80) % 80;
- y = (y + dy + 25) % 25;
- }
- int peek() { return stack.empty() ? 0 : stack.top(); }
- int pop() {
- if (stack.empty()) {
- return 0;
- } else {
- int v = stack.top();
- stack.pop();
- return v;
- }
- }
- void step() {
- char c = source[y][x];
- int a, b, v;
- switch (c) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- stack.push(c - '0');
- break;
- case '+':
- stack.push(pop() + pop());
- break;
- case '-':
- a = pop(); b = pop();
- stack.push(b - a);
- break;
- case '*':
- stack.push(pop() * pop());
- break;
- case '/':
- a = pop(); b = pop();
- stack.push(b / a);
- break;
- case '%':
- a = pop(); b = pop();
- stack.push(b % a);
- break;
- case '!':
- stack.push(!pop());
- break;
- case '`':
- a = pop(); b = pop();
- stack.push(b > a);
- break;
- case '>':
- dx = 1; dy = 0;
- break;
- case '<':
- dx = -1; dy = 0;
- break;
- case 'v':
- dx = 0; dy = 1;
- break;
- case '^':
- dx = 0; dy = -1;
- break;
- case '?':
- v = rand() % 2 == 0 ? -1 : 1;
- if (rand() % 2 == 0) {
- dx = v;
- } else {
- dy = v;
- }
- break;
- case '_':
- if (pop() == 0) {
- dx = 1;
- dy = 0;
- } else {
- dx = -1;
- dy = 0;
- }
- break;
- case '|':
- if (pop() == 0) {
- dx = 0; dy = 1;
- } else {
- dx = 0; dy = -1;
- }
- break;
- case '"':
- while (true) {
- move();
- v = source[y][x];
- if (v == '"') {
- break;
- } else {
- stack.push(v);
- }
- };
- break;
- case ':':
- stack.push(peek());
- break;
- case '\\':
- a = pop(); b = pop();
- stack.push(a);
- stack.push(b);
- break;
- case '$':
- pop();
- break;
- case '.':
- std::cout << pop() << " ";
- break;
- case ',':
- std::cout << ((char)pop());
- break;
- case '#':
- move();
- break;
- case 'p':
- a = pop(); b = pop(); v = pop();
- source[a][b] = v;
- break;
- case 'g':
- a = pop(); b = pop();
- stack.push(source[a][b]);
- break;
- case '&':
- stack.push(std::cin.get() - '0');
- break;
- case '~':
- stack.push(std::cin.get());
- break;
- case '@':
- stack.push(std::cin.get());
- finished = true;
- dx = dy = 0;
- break;
- default:
- break;
- }
- move();
- }
- void run() { while (!finished) step(); }
- };
- std::istream &operator>>(std::istream &in, Program &program) {
- std::string line;
- for (int y = 0; y < 25; y++) {
- if (std::getline(in, line) == 0) break;
- std::strncpy(program.source[y], line.c_str(), 81);
- }
- return in;
- }
- int main(int argc, char **argv) {
- Program program;
- std::ifstream in{argv[1], std::ifstream::in};
- in >> program;
- program.run();
- std::cout << std::endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement