Cod sursa(job #2543680)

Utilizator KPP17Popescu Paul KPP17 Data 11 februarie 2020 13:40:09
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.32 kb
using namespace std;



#define fisier "bool"

#ifdef fisier
    #include <fstream>
    ifstream in(fisier ".in");
    ofstream out(fisier ".out");
#else
    #include <iostream>
    #define in cin
    #define out cout
#endif



const int
MAX_CHAR = 1000,
MAX_ELEMENT = MAX_CHAR + 1,

STOP = -1,
FALSE = 0,
TRUE = 1,
PARAN = 2,
NOT = 3,
AND = 4,
OR = 5,
VAR = 6;



bool variabila_set['Z' - 'A' + 1];

inline bool variabila_get(int tip) {return variabila_set[tip - VAR];}

int *elem;



int citeste_elem(char*& str) {

    /**

    TIP | VAL
    ----------
     -1 | STOP
      0 | FALSE
      1 | TRUE
      2 | PARAN
      3 | NOT
      4 | AND
      5 | OR
    ----------
      6 | A
      7 | B
      8 | C
      .
      .
      .
     29 | X
     30 | Y
     31 | Z

    **/

    if (*str == ')')                  {str += 1; return STOP; }
    if (*str == 'F' && str[1] == 'A') {str += 5; return FALSE;}
    if (*str == 'T' && str[1] == 'R') {str += 4; return TRUE; }
    if (*str == '(')                  {str += 1; return PARAN;}
    if (*str == 'N' && str[1] == 'O') {str += 3; return NOT;  }
    if (*str == 'A' && str[1] == 'N') {str += 3; return AND;  }
    if (*str == 'O' && str[1] == 'R') {str += 2; return OR;   }

    str += 1; return str[-1] - 'A' + VAR;

}



struct Expresie {

    int elemente[MAX_ELEMENT];

    int nr_elemente;



    void citeste() {

        char str[MAX_CHAR];

        in.getline(str, MAX_CHAR);

        for (char* ptr = str; *ptr;) {

            if (*ptr == ' ') {

                ptr++;

            } else {

                elemente[nr_elemente++] = citeste_elem(ptr);

            }

        }

        elemente[nr_elemente++] = STOP;

    }



    void arata_cod() {

        for (int i = 0; i < nr_elemente; i++) {

            out << elemente[i] << ' ';

        }

    }



    bool eval();

    bool grad_0_PARAN_TRUE_FALSE_VAR() {

        if (*elem < PARAN) { /// TRUE FALSE

            return *(elem++);

        }

        if (*elem == PARAN) { /// PARANTEZA

            elem++;

            bool rt = grad_3_OR();

            elem++;

            return rt;

        }

        return variabila_get(*(elem++)); /// VAR

    }



    bool grad_1_NOT() {

        if (*elem == NOT) {

            elem++;

            return !grad_0_PARAN_TRUE_FALSE_VAR();

        }

        return grad_0_PARAN_TRUE_FALSE_VAR();

    }



    bool grad_2_AND() {

        bool rt = grad_1_NOT();

        while (*elem == AND) {

            elem++;

            rt &= grad_1_NOT(); // acceptat conform standardului c++ pentru bool

        }

        return rt;

    }



    bool grad_3_OR() {

        bool rt = grad_2_AND();

        while (*elem == OR) {

            elem++;

            rt |= grad_2_AND(); // acceptat conform standardului c++ pentru bool

        }

        return rt;

    }

} expr;



bool Expresie::eval() {elem = Expresie::elemente; return grad_3_OR();}



int main() {

    expr.citeste();

    char chr; int n; in >> n;

    while (n--) {

        in >> chr;

        chr -= 'A';
        variabila_set[chr] = !variabila_set[chr];

        out << expr.eval();

    }

}









//