Cod sursa(job #1979928)

Utilizator refugiatBoni Daniel Stefan refugiat Data 11 mai 2017 18:03:04
Problema Bool Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.67 kb
#include <iostream>
#include <cstdio>
using namespace std;
FILE*si=fopen("bool.in","r");
FILE*so=fopen("bool.out","w");
char v[1005];
int val[30];
int lg;
int poz;
inline int calc(int x,int o,int y)
{
    switch(o)
    {
        case 1:return (x==1||y==1);
        case 2:return (x==1&&y==1);
    }
}
inline int expresie()
{
    if(v[poz]=='!')
    {
        ++poz;
        return 1-expresie();
    }
    if(v[poz]=='1')
    {
        ++poz;
        return 1;
    }
    if(v[poz]=='0')
    {
        ++poz;
        return 0;
    }
    if(v[poz]>='A'&&v[poz]<='Z')
    {
        ++poz;
        return val[v[poz-1]-'A'];
    }
    ++poz;
    int v1,v2,v3,o1,o2;
    v1=expresie();
    if(v[poz]==')')
    {
        poz++;
        return v1;
    }
    if(v[poz]=='|')
        o1=1;
    if(v[poz]=='&')
        o1=2;
    ++poz;
    v2=expresie();
    while(1)
    {
        if(v[poz]==')')
        {
            poz++;
            break;
        }
        if(v[poz]=='|')
            o2=1;
        if(v[poz]=='&')
            o2=2;
        ++poz;
        v3=expresie();
        if(o1==2)
        {
            v1=calc(v1,o1,v2);
            v2=v3;
            o1=o2;
        }
        else
        {
            v2=calc(v2,o2,v3);
        }
    }
    v1=calc(v1,o1,v2);
    return v1;

}
int main()
{
    fgets(v+1,1005,si);
    v[0]='(';
    int mut=0;
    for(lg=1;v[lg]!='\n'&&v[lg];++lg)
    {
        if(v[lg]=='A')
        {
            if(v[lg+1]=='N'&&v[lg+2]=='D')
            {
                v[lg-mut]='&';
                mut+=2;
                lg+=2;
            }
            else
                v[lg-mut]='A';
        }
        else
            if(v[lg]=='O')
            {
                if(v[lg+1]=='R')
                {
                    v[lg-mut]='|';
                    mut++;
                    ++lg;
                }
                else
                    v[lg-mut]='O';
            }
            else
                if(v[lg]=='N')
                {
                    if(v[lg+1]=='O'&&v[lg+2]=='T')
                    {
                        v[lg-mut]='!';
                        mut+=2;
                        lg+=2;
                    }
                    else
                        v[lg-mut]='N';
                }
                else
                    if(v[lg]=='T')
                    {
                        if(v[lg+1]=='R'&&v[lg+2]=='U'&&v[lg+3]=='E')
                        {
                            v[lg-mut]='1';
                            mut+=3;
                            lg+=3;
                        }
                        else
                            v[lg-mut]='T';
                    }
                    else
                        if(v[lg]=='F')
                        {
                            if(v[lg+1]=='A'&&v[lg+2]=='L'&&v[lg+3]=='S'&&v[lg+4]=='E')
                            {
                                v[lg-mut]='0';
                                mut+=4;
                                lg+=4;
                            }
                            else
                                v[lg-mut]='F';
                        }
                        else
                            if(v[lg]==' ')
                                ++mut;
                            else
                                v[lg-mut]=v[lg];
    }
    v[lg-mut]=')';
    lg-=mut;
    int n;
    char a;
    fscanf(si,"%i",&n);
    a=fgetc(si);
    for(int i=1;i<=n;++i)
    {
        a=fgetc(si);
        val[a-'A']=1-val[a-'A'];
        poz=0;
        fprintf(so,"%i",expresie());
    }
    return 0;
}