Cod sursa(job #2527181)

Utilizator FasoleboiTudor Gadalean Fasoleboi Data 19 ianuarie 2020 19:17:49
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <fstream>
#include <cstring>
#define N 1001
using namespace std;

ifstream fin("bool.in");
ofstream fout("bool.out");

char s[N], character;
bool values[27];
int n;

int eval(char*& expr);
int operand(char*& expr);
int value(char*& expr);
int NOT(char*& expr);
int OR(char*& expr);
int AND(char*& expr);


int eval(char*& expr){
    return OR(expr);
}

void prel(char*& pre){
    while(pre[0]){
        if(pre[0]==' '){
            strcpy(pre, pre+1);
        }else if(pre[0] == 'T' && pre[1] == 'R'){
            strcpy(pre, pre+3);
            pre[0] = '1';
            pre++;
        }else if(pre[0] == 'F' && pre[1] == 'A'){
            strcpy(pre, pre+4);
            pre[0] = '0';
            pre++;
        }else if(pre[0] == 'O' && pre[1] == 'R'){
            strcpy(pre, pre+1);
            pre[0] = '|';
            pre++;
        }else if(pre[0] == 'A' && pre[1] == 'N'){
            strcpy(pre, pre+2);
            pre[0] = '&';
            pre++;
        }else if(pre[0] == 'N' && pre[1] == 'O'){
            strcpy(pre, pre+2);
            pre[0] = '!';
            pre++;
        }else{
            pre++;
        }
    }
}

int AND(char*& expr){
    int result = NOT(expr);
        while(expr[0] == '&'){
            result &= NOT(++expr);
        }
    return result;
}

int NOT(char*& expr){
    int result = 0;
    if(expr[0] == '!'){
        result = !NOT(++expr);
    }else{
        result = operand(expr);
    }
    return result;
}

int OR(char*& expr){
    int result =AND(expr);
    while(expr[0] == '|'){
        result |= AND(++expr);
    }
    return result;
}

int value(char*& expr){
    char c = expr[0];
    expr++;
    if(isdigit(c)){
        return  c - '0';
    }else{
        return values[c-'A'];
    }
}

int operand(char*& expr){
    int result;
    if(expr[0]=='('){
        result = eval(++expr);
        expr++;
    }else{
        result = value(expr);
    }
    return result;
}

int main(){
    fin.get(s, N - 1);
    char *pre = s;
    prel(pre);
    fin>>n;
    while(n){
        fin>>character;
        char* expr = s;
        values[character - 'A'] = !values[character - 'A'];
        fout<<eval(expr);
        n--;
    }
    return 0;
}