Cod sursa(job #250506)

Utilizator AstronothingIulia Comsa Astronothing Data 31 ianuarie 2009 00:46:58
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <fstream>

using namespace std;

int val[1000],n;
char *true1 = "1";
char *false1 = "0";

char* substr(char *s,int i,int j)   //guess what it does
{
    char *rez = new char[1001];
    strcpy(rez,s+i);
    rez[j+1-i]=0;
    return rez;
}

char* compute_not(char* s)
{
    if (s[0]=='1') return false1;
    return true1;
}

char* compute_and(char*s,char*t)
{
    if((s[0]+t[0])==('1'+'1')) return true1;
    return false1;
}

char* compute_or(char*s,char*t)
{
    if(s[0]+t[0]=='0'+'0') return false1;
    return true1;
}

char* deparantezeaza(char* s)
{
    int l=strlen(s);
    if(s[0]=='(')
    {
        int ok=0;
        int p=1;
        for(int i=1; i<l && !ok ;i++)
        {
            if(!p) ok=1;
            if(s[i]==')') p--;
            else if(s[i]=='(') p++;

        }
        if(!ok)
        {
            s=substr(s,1,l-2);
            s=deparantezeaza(s);
        }
    }

    return s;

}


char* eval(char *s)
{
    s=deparantezeaza(s);

    int l=strlen(s);

    if(l==1) if(val[s[0]-'A'])
                return "1";
             else
                return "0";

    else if (!strcmp(s,"TRUE")) return "1";

    else if (!strcmp(s,"FALSE")) return "0";

    else
    {
        int and1=-1;
        int or1=-1;
        int not1=-1;

        int p=0;


        for(int i=0;i<l-1;i++)      //gasesc semnul de prioritate minima
        {
            if(s[i]=='(') p++;
            else if(s[i]==')') p--;
            else if(!p)
            {
                if(s[i]=='A' && s[i+1]=='N') and1=i+4;
                else if(!p && s[i]=='O' && s[i+1]=='R') or1=i+3;
                else if(s[i]=='N' && s[i+1]=='O') not1=i+4;
            }
        }

        if (or1>-1) return compute_or(eval(substr(s,0,or1-5)),eval(substr(s,or1,l)));
        if (and1>-1) return compute_and(eval(substr(s,0,and1-6)),eval(substr(s,and1,l)));
        if (not1>-1) return compute_not(eval(substr(s,not1,l)));         //pai not1 ar trebui sa fie mereu 4 cred

    }

}

int main()
{
    fstream f("bool.in",ios::in);
    fstream f2("bool.out",ios::out);
    char *p,*s;
    char *vars;
    int it;
    vars = new char[101];
    p=new char[1001];
    f.get(p,1000);
    f.get();
    f>>it;
    f>>vars;

//    assign_vars(p,val,n);
    val[0]=0;

    for(int i=1;i<=it;i++)
    {
        val[vars[i-1]-'A']^=1;
        s=p;
        f2<<eval(s);
    }


    f.close();
    f2.close();
    return 0;
}