Cod sursa(job #2192156)

Utilizator timar_andreiTimar Andrei timar_andrei Data 4 aprilie 2018 20:46:30
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.21 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin("bool.in");
ofstream fout("bool.out");

int evalN();

char exp[1005];
int N;
bool var[30];
int Indice;

int eval()
{
    int result = evalN();
    while(exp[Indice] == 'A' && exp[Indice+1] == 'N' && exp[Indice+2] == 'D')
    {
        Indice += 3;
        int a = evalN();
        result = result && a;
    }
    return result;
}

int evaluateExpr()
{
    int result = eval();
    while(exp[Indice] == 'O' && exp[Indice+1] == 'R')
    {
        Indice += 2;
        int a = eval();
        result = result || a;
    }
    return result;
}

int evalN()
{
    int result=0;
    int snot=0;
    while(exp[Indice] == 'N' && exp[Indice+1] == 'O' && exp[Indice+2] == 'T')
    {
        snot = !snot;
        Indice += 3;
    }

    if (exp[Indice] == '(')
    {
        Indice++;
        result = evaluateExpr();
        Indice++;
    }
    else
    {
        if (exp[Indice] == 'T' && exp[Indice+1] == 'R' && exp[Indice+2] == 'U' && exp[Indice+3] == 'E')
        {
            Indice += 4;
            return !snot;
        }
        if (exp[Indice] == 'F' && exp[Indice+1] == 'A' && exp[Indice+2] == 'L' && exp[Indice+3] == 'S' && exp[Indice+4] == 'E')
        {
            Indice += 5;
            return snot;
        }
        else
        {
            result = var[exp[Indice]-'A'];
            Indice++;
        }
    }

    if (snot)
        return !result;
    return result;
}


int evaluate(char s[])
{
    int finish = strlen(s);
    if (finish == 1)
    {
        return var[s[0]-'A'];
    }
    else if (strcmp(s, "FALSE") == 0)
    {
        return 0;
    }
    else if (strcmp(s, "TRUE") == 0)
    {
        return 1;
    }

    char t[finish];
    int k=0;
    int result = 0;

    for(int i=0;i<finish;i++)
    {
        if (s[i] == ' ')
        {
            t[k] = 0;
            i++;

            if (strcmp(t,"AND") == 0)
            {
                int right = evaluate(s+i);
                result = result && right;
            }
            else if (strcmp(t, "OR") == 0)
            {
                int right = evaluate(s+i);
                result = result || right;
            }
            else if (strcmp(t, "NOT") == 0)
            {
                result = !evaluate(s+i);
            }
            else
            {
                result = evaluate(t);
            }

            k = 0;
        }
        else if (s[i] == '(')
        {
            t[k] = 0;
            result = evaluate(s+i+1);
        }
        else if (s[i] == ')')
        {
            t[k] = 0;
            return evaluate(t);
        }
        t[k++] = s[i];
        t[k] = 0;
    }

    return result;
}

int main()
{
    char s1[1005];
    fin.getline(s1,1005);
    int k=0;
    for(int i=0;s1[i];i++)
    {
        if (s1[i] == ' ')
            continue;
        exp[k++] = s1[i];
    }

    fin>>N;

    char c;

    for(int i=1;i<=N;i++)
        {
            fin>>c;
            Indice = 0;
            k = c-'A';
            var[k] = !var[k];
            fout<<evaluateExpr();
        }

    return 0;
}