Cod sursa(job #2573463)

Utilizator marius004scarlat marius marius004 Data 5 martie 2020 17:43:27
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda recapitulare_finala Marime 2.18 kb
#include <fstream>
#include <string>

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

std::string s;
int i,t;
bool expresieOr(),expresieAnd(),expresieXor(),factor();
bool map[256];
char c;

void parseString(std::string& s){
    
    std::string sol = "";
    
    for(int i = 0;i < s.size();++i){
        
        if(s[i] == ' ')
            continue;
        
        if(s[i] == '(' || s[i] == ')'){
            sol += s[i];
            continue;
        }
        
        if(s[i] == 'A' && s[i + 1] == 'N' && s[i + 2] == 'D'){
            sol += "&";
            i += 2;
            continue;
        }
        
        if(s[i] == 'N' && s[i + 1] == 'O' && s[i + 2] == 'T'){
            sol += "1^";
            i += 2;
            continue;
        }
        
        if(s[i] == 'O' && s[i + 1] == 'R'){
            sol += "|";
            i++;
            continue;
        }
        
        if(s[i] == 'T' && s[i + 1] == 'R'){
            sol += "1";
            i += 3;
            continue;
        }
        
        if(s[i] == 'F' && s[i + 1] == 'A'){
            sol += "0";
            i += 4;
            continue;
        }
        
        sol += s[i];
    }
    
    s = sol;
}

bool expresieOr(){
    
    bool r = expresieAnd();
    
    while(s[i] == '|'){
        i++;
        r |= expresieAnd();
    }
    
    return r;
}

bool expresieAnd(){
    
    bool r = expresieXor();
    
    while(s[i] == '&'){
        i++;
        r &= expresieXor();
    }
    
    return r;
}

bool expresieXor(){
    
    bool r = factor();
    
    while(s[i] == '^'){
        i++;
        r ^= factor();
    }
    
    return r;
}

bool factor(){
    
    bool r = 0;
    
    if(s[i] == '('){
        
        i++;
        r = expresieOr();
        i++;
        
        return r;
    }
    
    if(s[i] == '1'){
        i++;
        return true;
    }
    
    if(s[i] == '0'){
        i++;
        return false;
    }
    
    r = map[s[i]];
    i++;
    
    return r;
}


int main(){
    
    std::getline(f,s);
    
    parseString(s);
    
    f >> t;
    
    while(t--){
        
        f >> c;
        
        i = 0;
        map[c] = 1 - map[c];
        
        g << expresieOr();
    }
    
    return 0;
}