Cod sursa(job #1717569)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 15 iunie 2016 10:59:04
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <cstring>
#include <fstream>
#define isOR(i) a[i] == 'O' && a[i+1] == 'R'
#define isAND(i) a[i] == 'A' && a[i+1] == 'N' && a[i+2] == 'D'
#define isNOT(i) a[i] == 'N' && a[i+1] == 'O' && a[i+2] == 'T'
#define isTRUE(i) a[i] == 'T' && a[i+1] == 'R' && a[i+2] == 'U' && a[i+3] == 'E'
#define isFALSE(i) a[i] == 'F' && a[i+1] == 'A' && a[i+2] == 'L' && a[i+3] == 'S' && a[i+4] == 'E'


using namespace std;

ifstream f("bool.in");
ofstream g("bool.out");

char a[1005], b[1005];
bool val[40];
int l, n, i, j, k;

bool And();
bool Or();
bool eval();

bool And(){
    bool intors = 0, K = 0;
    while (a[k] == ' ')
        k++;
    while (isNOT(k)){
        intors = !intors;
        k += 4;
    }

    if (a[k] == '('){
        k++;
        K = eval();
        k++;
    }
    else if (a[k] >= 'A' && a[k] <= 'Z' && !(a[k+1] >= 'A' && a[k+1] <= 'Z'))
        K = val[ a[k] - 'A' + 1], k++;

    else if (isTRUE(k) || isFALSE(k)){
        if (isTRUE(k))
            K = 1, k+=4;
        else if (isFALSE(k))
            K = 0, k+=5;
    }
    while (a[k] == ' ')k++;

    if (intors == 1)
        K = !K;

    return K;
}

bool Or(){
    bool K = And();
    while (a[k] == ' ') k++;

    while (isAND(k))
        k+=4, K &= Or();

    return K;
}

bool eval(){
    bool K = Or();
    while (a[k] == ' ') k++;

    while (isOR(k))
        k +=3, K |= Or();
    return K;
}

int main(){
    f.getline(a, sizeof(a));
    l = strlen(a);
    f >> n; f.get();
    f.getline(b, sizeof(b));
    //g << b;
    for (i = 0; i < n; i++){
        k = 0;
        val[ b[i] - 'A' + 1 ] = !val[ b[i] - 'A' + 1 ];
        g << eval();
    }
    return 0;
}