Cod sursa(job #1213908)

Utilizator TibixbAndrei Tiberiu Tibixb Data 29 iulie 2014 10:36:43
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include<fstream>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int i, k, v[1005], n;
char chi[1007], ch[1007], ch2;
int expresie();
int sau();
int si();
int ixor();

int expresie(){
    int r=sau();
    while(ch[i]=='|'){
        i++;
        r = (r | sau());
    }
    return r;
}
int sau(){
    int r=si();
    while(ch[i]=='&'){
        i++;
        r = (r & si());
    }
    return r;
}

int si(){
    int r=ixor();
    while(ch[i]=='~'){
        i++;
        r = (r ^ ixor());
    }
    return r;
}

int ixor() {
    int r;
    if (ch[i] == '(') {
        i++;
        r = expresie();
        i++;
    } else {
        if (ch[i] == '1')
            r = 1;
        else
            if (ch[i] == '0')
                r = 0;
            else
                r = v[ ch[i] ];

        i++;
    }


    return r;
}




FILE *in=fopen("bool.in","r");
ofstream out("bool.out");
int main(){
    fgets(chi, 1003, in);
    int x = strlen(chi);
    for(i=0; chi[i]!=0; i++){
        //cout<<i<<"\n";
        if (chi[i] == '\n') {
            ch[++k] = 0;
            break;
        }
        if (chi[i] == ' ') {
            continue;
        }

        if(chi[i]=='A' && chi[i+1]=='N' && chi[i+2]=='D'){
            ch[++k]='&';
            i+=2;
            continue;
        }

        if(chi[i]=='O' && chi[i+1]=='R'){
            ch[++k]='|';
            i+=1;
            continue;
        }
        if(chi[i]=='('){
            ch[++k]=chi[i];
            continue;
        }
        if(chi[i]==')'){
            ch[++k]=chi[i];
            continue;
        }
        if(chi[i]=='T' && chi[i+1]=='R' && chi[i+2]=='U' && chi[i+3]=='E'){
            ch[++k]='1';
            i+=3;
            continue;
        }
        if(chi[i]=='F' && chi[i+1]=='A' && chi[i+2]=='L' && chi[i+3]=='S' && chi[i+4]=='E'){
            ch[++k]='0';
            i+=4;
            continue;
        }
        //if(chi[i]==' '){
            //i++;
            //continue;
        //}
        if(chi[i]=='N' && chi[i+1]=='O' && chi[i+2]=='T'){
            ch[++k]='1';
            ch[++k]='~';
            i+=2;
            continue;
        }

        if(chi[i]>='A' && chi[i]<='Z'){
            ch[++k]=chi[i];
            //if(chi[i+1]==' ')
                //i++;
            continue;
        }

    }
    //in>>n;
    fscanf(in, "%d\n", &n);
    for(;n--;){
        i=1;
        //in>>ch2;
        fscanf(in, "%c", &ch2);
        v[ch2]=(v[ch2]+1)%2;
        out<<expresie();
    }
    out<<"\n";
    //for(i=1; i<=k; i++)
    //    out<<ch[i];
return 0;
}