Cod sursa(job #2832832)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 14 ianuarie 2022 13:34:09
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.55 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int max_size = 1e3 + 1, max_f = 3e1;

char s[max_size], aux[max_size];
int p;
bool valori[max_f];
bool expresie();
bool termen();

bool expresie()
{
    bool rez = termen();
    while(s[p] == '&' || s[p] == '|')
    {
        if (s[p] == '&')
        {
            p++;
            rez &= termen();
        }
        else
        {
            p++;
            rez |= termen();
        }
    }
    return rez;
}

bool termen ()
{
    bool rez, semn = true;
    while (s[p] == '!')
    {
        p++;
        if (semn)
        {
            semn = false;
        }
        else
        {
            semn = true;
        }
    }
    if (s[p] == '(')
    {
        p++;
        rez = expresie();
        p++;
        if (semn)
        {
            return rez;
        }
        else
        {
            if (!rez)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
    if (isdigit(s[p]))
    {
        if (s[p] == '1')
        {
            rez = true;
        }
        else
        {
            rez = false;
        }
    }
    else
    {
        rez = valori[s[p] - 'A'];
    }
    p++;
    if (semn)
    {
        return rez;
    }
    else
    {
        if (!rez)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

int main ()
{
    in.getline(aux, max_size - 1);
    for (int i = 0; i < strlen(aux); i++)
    {
        int iv = i;
        if (aux[iv] == 'A')
        {
            if (iv + 2 < strlen(aux))
            {
                if (aux[iv + 1] == 'N' && aux[iv + 2] == 'D')
                {
                    s[p++] = '&';
                    i += 2;
                }
                else
                {
                    s[p++] = aux[iv];
                }
            }
            else
            {
                s[p++] = aux[iv];
            }
        }
        if (aux[iv] == 'O')
        {
            if (iv + 1 < strlen(aux))
            {
                if (aux[iv + 1] == 'R')
                {
                    s[p++] = '|';
                    i++;
                }
                else
                {
                    s[p++] = aux[iv];
                }
            }
            else
            {
                s[p++] = aux[iv];
            }
        }
        if (aux[iv] == 'N')
        {
            if (i + 2 < strlen(aux))
            {
                if (aux[iv + 1] == 'O' && aux[iv + 2] == 'T')
                {
                    s[p++] = '!';
                    i += 2;
                }
                else
                {
                    s[p++] = aux[iv];
                }
            }
            else
            {
                s[p++] = aux[i];
            }
        }
        if (aux[iv] == 'T')
        {
            if (iv + 3 < strlen(aux))
            {
                if (aux[iv + 1] == 'R' && aux[iv + 2] == 'U' && aux[iv + 3] == 'E')
                {
                    s[p++] = '1';
                    i += 3;
                }
                else
                {
                    s[p++] = aux[iv];
                }
            }
            else
            {
                s[p++] = aux[iv];
            }
        }
        if (aux[iv] == 'F')
        {
            if (iv + 4 < strlen(aux))
            {
                if (aux[iv + 1] == 'A' && aux[iv + 2] == 'L' && aux[iv + 3] == 'S' && aux[iv + 4] == 'E')
                {
                    s[p++] = '0';
                    i += 4;
                }
                else
                {
                    s[p++] = aux[iv];
                }
            }
            else
            {
                s[p++] = aux[iv];
            }
        }
        if (aux[iv] != 'A' && aux[iv] != 'O' && aux[iv] != 'N' && aux[iv] != 'T' && aux[iv] != 'F' && aux[iv] != ' ')
        {
            s[p++] = aux[iv];
        }
    }
    int n;
    in >> n;
    for (int i = 1; i <= n; i++)
    {
        p = 0;
        char ch;
        in >> ch;
        if (!valori[ch - 'A'])
        {
            valori[ch - 'A'] = true;
        }
        else
        {
            valori[ch - 'A'] = false;
        }
        out << expresie();
    }
    in.close();
    out.close();
    return 0;
}