Cod sursa(job #2529013)

Utilizator marius004scarlat marius marius004 Data 22 ianuarie 2020 20:55:47
Problema Bool Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <iostream>
#include <fstream>
#include <string>

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

const int NMAX = 256;
int i,t,map[NMAX];
char variable;
std::string s;

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

bool expresieOr();
bool expresieAnd();
bool expresieNot();
bool factor();

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

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

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

bool factor(){
    
    if(s[i] == '1')
        return 1;
    
    if(s[i] == '0')
        return 0;
    
    return map[s[i]];
}

int main(){
    
    std::getline(f,s);
    
    parseString(s);// aduc expresia la o forma mai simpla decat cea initiala
    
    f >> t;
    
    while(t--){
        
        f >> variable;
        
        map[variable] = !map[variable];
        i = 0;
        
        g << expresieOr();
    }
    
    return 0;
}