Cod sursa(job #911684)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 11 martie 2013 20:24:14
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
char buffer[1005];
char buf[1005];
bool val[256];
int id,len;

bool eand();
bool eor();
bool eval();

bool eor() {
    bool r1,r2;
    r1 = eand();
    while (buf[id] == '|') {
        id++;
        r2 = eand();
        r1 = r1 || r2;
    }
    return r1;
}

bool eand() {
    bool r1,r2;
    r1 = eval();
    while (buf[id] == '&') {
        id++;
        r2 = eval();
        r1 = r1 && r2;
    }
    return r1;
}

bool eval() {
    bool notted = false;
    bool r;

    while (buf[id] == '!') {
        notted = !notted;
        id++;
    }

    if (buf[id] == '(') {
        id++;
        r = eor();
        id++;
    } else
        if ('A' <= buf[id] && buf[id] <= 'Z') {
            r = val[buf[id++]];
        } else
            if (buf[id++] == 1) r = true;
            else if (buf[id++] == 0) r = false;

    if (notted) return !r;
    else return r;
}

int main() {
    f.getline(buffer,1001);

    len = strlen(buffer);
    for (int i=0;i<len;i++) {

        if ('A' <= buffer[i] && buffer[i] <= 'Z' &&( buffer[i+1]<'A' || buffer[i+1]>'Z')) {
            buf[id++] = buffer[i];
            continue;
        }
        if (buffer[i] == 'A' && buffer[i+1] == 'N' && buffer[i+2] == 'D') {
            buf[id++] = '&';
            i += 2;
            continue;
        }
        if (buffer[i] == 'N' && buffer[i+1] == 'O' && buffer[i+2] == 'T') {
            buf[id++] = '!';
            i += 2;
            continue;
        }
        if (buffer[i] == 'O' && buffer[i+1] == 'R') {
            buf[id++] = '|';
            i++;
            continue;
        }
        if (buffer[i] == 'T' && buffer[i+1] == 'R' && buffer[i+2] == 'U' && buffer[i+3] == 'E') {
            buf[id++] = '1';
            i += 3;
            continue;
        }
        if (buffer[i] == 'F' && buffer[i+1] == 'A' && buffer[i+2] == 'L' && buffer[i+3] == 'S' && buffer[i+4] == 'E') {
            buf[id++] = '0';
            i += 4;
            continue;
        }
        if (buffer[i] == '(' || buffer[i] == ')') {
            buf[id++] = buffer[i];
        }
    }
    int t;
    f>>t;
    while (t--) {
        char crt;
        id = 0;
        f>>crt;
        val[crt] = !val[crt];
        g<<(eor()?(1):(0));
    }
    g<<"\n";
    return 0;
}