Cod sursa(job #2131173)

Utilizator ZanoxNonea Victor Zanox Data 14 februarie 2018 14:24:19
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <fstream>
#include <iostream>
#include <cstring>

using namespace std;

char var[26],exp[1000];

#define AND 0
#define OR 1
#define NOT 2
#define TRUE 3
#define FALSE 4

char so[1001],s[1001],c;
int i,j,l,n;

int eval(int l1,int l2)
{
    /*for(int i=l1;i<=l2;i++)
    {
        if(exp[i]==AND)cout<<"AND";
        else if(exp[i]==OR)cout<<"OR";
        else if(exp[i]==NOT)cout<<"NOT";
        else if(exp[i]==TRUE)cout<<"TRUE";
        else if(exp[i]==FALSE)cout<<"FALSE";
        else cout<<exp[i];
        cout<<' ';
    }
    cout<<'\n';*/
    if(l1==l2)
    {
        if(exp[l1]==TRUE)return 1;
        else if(exp[l1]==FALSE)return 0;
        else return var[exp[l1]-'A'];
    }
    if(l1=='('&&l2==')')return eval(l1+1,l2-1);
    int i,p;
    for(i=l1+1,p=0;i<l2;i++)
    {
        if(exp[i]=='(')p++;
        else if(exp[i]==')')p--;
        else if(p==0&&exp[i]==OR)return eval(l1,i-1)||eval(i+1,l2);
    }
    for(i=l1+1,p=0;i<l2;i++)
    {
        if(exp[i]=='(')p++;
        else if(exp[i]==')')p--;
        else if(p==0&&exp[i]==AND)return eval(l1,i-1)&&eval(i+1,l2);
    }
    return !(eval(l1+1,l2));
}

void adv(int&i)
{
    i+=strlen(s+i);
    while(s[i]=='\0')i++;
}

int main()
{
    fstream f("bool.in",ios::in),g("bool.out",ios::out);
    f.getline(so,1001);
    l=strlen(so);
    for(i=0,j=0;i<l;i++,j++)
    {
        if(so[i]==' ')s[j]='\0';
        else if(so[i]=='(')
        {
            s[j]='(';
            j++;
            s[j]='\0';
        }
        else if(so[i]==')')
        {
            s[j]='\0';
            j++;
            s[j]=')';
        }
        else s[j]=so[i];
    }
    s[j]='\0';
    l=j;
    //for(i=0,j=0;i<l;i+=strlen(s+i)+1,j++)cout<<s+i<<' ';
    //cout<<'\n';
    for(i=0,j=0;i<l;adv(i),j++)
    {
        if(!strcmp(s+i,"AND"))exp[j]=AND;
        else if(!strcmp(s+i,"OR"))exp[j]=OR;
        else if(!strcmp(s+i,"NOT"))exp[j]=NOT;
        else if(!strcmp(s+i,"TRUE"))exp[j]=TRUE;
        else if(!strcmp(s+i,"FALSE"))exp[j]=FALSE;
        else if(!strcmp(s+i,"("))exp[j]='(';
        else if(!strcmp(s+i,")"))exp[j]=')';
        else exp[j]=s[i];
    }
    l=j;
    /*for(i=0;i<l;i++)
    {
        if(exp[i]==AND)cout<<"AND";
        else if(exp[i]==OR)cout<<"OR";
        else if(exp[i]==NOT)cout<<"NOT";
        else if(exp[i]==TRUE)cout<<"TRUE";
        else if(exp[i]==FALSE)cout<<"FALSE";
        else cout<<exp[i];
        cout<<' ';
    }*/
    f>>n;
    for(i=0;i<n;i++)
    {
        f>>c;
        var[c-'A']=!var[c-'A'];
        g<<eval(0,j-1);
    }
}