Cod sursa(job #2851041)

Utilizator razvan4974Manole Razvan-Cristian razvan4974 Data 17 februarie 2022 22:56:02
Problema Bool Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f ("bool.in");
ofstream g ("bool.out");

char t[1005], s[1005], *p, c;
bool val[30];
int k, n;

bool eval();
bool termen();
bool factor();

void citire()
{
    f.getline(t, 1005);
    f >> n;
    f.get();
}

void descifrare()
{
    p = t;
    p = strtok(t, " ");
    while(p)
    {
        if (strcmp(p, "AND") == 0) strcat(s, "&");
        else if(strcmp(p, "OR") == 0) strcat(s, "|");
        else if(strcmp(p, "NOT") == 0) strcat(s, "!");
        else if(strstr(p, "TRUE") != 0)
        {
            char *m = strstr(p, "TRUE");
            strncat(s, p, m-p);
            strcat(s, "1");
            strcat(s, m+4);
        }
        else if(strstr(p, "FALSE") != 0)
        {
            char *m = strstr(p, "FALSE");
            strncat(s, p, m-p);
            strcat(s, "0");
            strcat(s, m+5);
        }
        else strcat(s, p);
        p = strtok(NULL, " ");
    }
}

bool eval()
{
    bool r;
    r = termen();
    while (*p == '|')
    {
        ++p;
        r |= termen();
    }
    return r;
}

bool termen()
{
    bool r;
    r = factor();
    while (*p == '&')
    {
        ++p;
        r &= factor();
    }
    return r;
}

bool factor()
{
    bool r = 0;
    if (*p == '!')
    {
        ++p;
        r =! factor();
    }
    else if (*p == '(')
    {
        ++p;
        r = eval();
        ++p;
    }
    else if (isalpha(*p))
    {
        r = val[*p-'A'];
        ++p;
    }
    else if (*p == '1')
    {
        ++p;
        r = true;
    }
    else if (*p == '0')
    {
        ++p;
        r = false;
    }
    return r;
}

int main()
{
    citire();
    descifrare();
    for (int i = 0; i < n; ++i)
    {
        p = s;
        f >> c;
        val[c-'A'] = !val[c-'A'];
        g << eval();
    }
    return 0;
}