Advertisement
Guest User

befunge.cc

a guest
Jun 1st, 2014
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <stack>
  5. #include <cstring>
  6.  
  7. struct Program {
  8.   std::stack<int> stack;
  9.   char source[25][81] = {{0}};
  10.   int x = 0, y = 0, dx = 1, dy = 0;
  11.   bool finished = false;
  12.  
  13.   void move() {
  14.     x = (x + dx + 80) % 80;
  15.     y = (y + dy + 25) % 25;
  16.   }
  17.  
  18.   int peek() { return stack.empty() ? 0 : stack.top(); }
  19.  
  20.   int pop() {
  21.     if (stack.empty()) {
  22.       return 0;
  23.     } else {
  24.       int v = stack.top();
  25.       stack.pop();
  26.       return v;
  27.     }
  28.   }
  29.  
  30.   void step() {
  31.     char c = source[y][x];
  32.     int a, b, v;
  33.     switch (c) {
  34.       case '0':
  35.       case '1':
  36.       case '2':
  37.       case '3':
  38.       case '4':
  39.       case '5':
  40.       case '6':
  41.       case '7':
  42.       case '8':
  43.       case '9':
  44.         stack.push(c - '0');
  45.         break;
  46.       case '+':
  47.         stack.push(pop() + pop());
  48.         break;
  49.       case '-':
  50.         a = pop(); b = pop();
  51.         stack.push(b - a);
  52.         break;
  53.       case '*':
  54.         stack.push(pop() * pop());
  55.         break;
  56.       case '/':
  57.         a = pop(); b = pop();
  58.         stack.push(b / a);
  59.         break;
  60.       case '%':
  61.         a = pop(); b = pop();
  62.         stack.push(b % a);
  63.         break;
  64.       case '!':
  65.         stack.push(!pop());
  66.         break;
  67.       case '`':
  68.         a = pop(); b = pop();
  69.         stack.push(b > a);
  70.         break;
  71.       case '>':
  72.         dx = 1; dy = 0;
  73.         break;
  74.       case '<':
  75.         dx = -1; dy = 0;
  76.         break;
  77.       case 'v':
  78.         dx = 0; dy = 1;
  79.         break;
  80.       case '^':
  81.         dx = 0; dy = -1;
  82.         break;
  83.       case '?':
  84.         v = rand() % 2 == 0 ? -1 : 1;
  85.         if (rand() % 2 == 0) {
  86.           dx = v;
  87.         } else {
  88.           dy = v;
  89.         }
  90.         break;
  91.       case '_':
  92.         if (pop() == 0) {
  93.           dx = 1;
  94.           dy = 0;
  95.         } else {
  96.           dx = -1;
  97.           dy = 0;
  98.         }
  99.         break;
  100.       case '|':
  101.         if (pop() == 0) {
  102.           dx = 0; dy = 1;
  103.         } else {
  104.           dx = 0; dy = -1;
  105.         }
  106.         break;
  107.       case '"':
  108.         while (true) {
  109.           move();
  110.           v = source[y][x];
  111.           if (v == '"') {
  112.             break;
  113.           } else {
  114.             stack.push(v);
  115.           }
  116.         };
  117.         break;
  118.       case ':':
  119.         stack.push(peek());
  120.         break;
  121.       case '\\':
  122.         a = pop(); b = pop();
  123.         stack.push(a);
  124.         stack.push(b);
  125.         break;
  126.       case '$':
  127.         pop();
  128.         break;
  129.       case '.':
  130.         std::cout << pop() << " ";
  131.         break;
  132.       case ',':
  133.         std::cout << ((char)pop());
  134.         break;
  135.       case '#':
  136.         move();
  137.         break;
  138.       case 'p':
  139.         a = pop(); b = pop(); v = pop();
  140.         source[a][b] = v;
  141.         break;
  142.       case 'g':
  143.         a = pop(); b = pop();
  144.         stack.push(source[a][b]);
  145.         break;
  146.       case '&':
  147.         stack.push(std::cin.get() - '0');
  148.         break;
  149.       case '~':
  150.         stack.push(std::cin.get());
  151.         break;
  152.       case '@':
  153.         stack.push(std::cin.get());
  154.         finished = true;
  155.         dx = dy = 0;
  156.         break;
  157.       default:
  158.         break;
  159.     }
  160.     move();
  161.   }
  162.  
  163.   void run() { while (!finished) step(); }
  164. };
  165.  
  166. std::istream &operator>>(std::istream &in, Program &program) {
  167.   std::string line;
  168.   for (int y = 0; y < 25; y++) {
  169.     if (std::getline(in, line) == 0) break;
  170.     std::strncpy(program.source[y], line.c_str(), 81);
  171.   }
  172.   return in;
  173. }
  174.  
  175. int main(int argc, char **argv) {
  176.   Program program;
  177.   std::ifstream in{argv[1], std::ifstream::in};
  178.   in >> program;
  179.   program.run();
  180.   std::cout << std::endl;
  181.   return 0;
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement