Cod sursa(job #2543314)

Utilizator KPP17Popescu Paul KPP17 Data 11 februarie 2020 01:36:11
Problema Bool Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.09 kb
/// W.I.P /// W.I.P /// W.I.P /// W.I.P /// W.I.P ///
         /// W.I.P /// W.I.P /// W.I.P /// W.I.P ///
                  /// W.I.P /// W.I.P /// W.I.P ///
                           /// W.I.P /// W.I.P ///
 /// WORK IN PROGRESS ///           /// W.I.P ///



using namespace std;





#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,

TRUE = 0,
FALSE = 1,
PARAN_0 = 2,
PARAN_1 = 3,
NOT = 4,
AND = 5,
OR = 6;



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

inline bool val_variabila_get(int tip) {return val_variabila_set[tip - 7];}



struct Element {

    int tip;

    char* citeste(char* str) {

        /**

        TIP | VAL
        ----------
          0 | TRUE
          1 | FALSE
          2 | (
          3 | )
          4 | NOT
          5 | AND
          6 | OR
        ----------
          7 | A
          8 | B
          9 | C
          .
          .
          .
         34 | Z

        **/

        if (*str == 'T' && str[1] == 'R') {tip = 0; return str + 4;}
        if (*str == 'F' && str[1] == 'A') {tip = 1; return str + 4;}
        if (*str == '(')                  {tip = 2; return str + 1;}
        if (*str == ')')                  {tip = 3; return str + 1;}
        if (*str == 'N' && str[1] == 'O') {tip = 4; return str + 3;}
        if (*str == 'A' && str[1] == 'N') {tip = 5; return str + 3;}
        if (*str == 'O' && str[1] == 'R') {tip = 6; return str + 2;}

        tip = *str - 'A' + 7; return str + 1;

    }

} *elem;



struct Expresie {

    Element 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 {

                ptr = elemente[nr_elemente++].citeste(ptr);

            }

        }

        elemente[nr_elemente++].tip = -1; /// -1 | STOP
        // element secret

    }



    void arata_cod() {

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

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

        }

    }



    bool eval();

    bool grad_0_PARAN_TRUE_FALSE_VAR() {

        out << (elem++)->tip << endl;
        arata_cod(); out << endl;

        if (elem->tip < PARAN_0) { /// TRUE FALSE

            return !(elem++->tip);

        }

        if (elem->tip == PARAN_0) { /// PARANTEZA

            elem++;

            bool rt = eval();

            elem++;

            return rt;

        }

        return val_variabila_get(elem++->tip); /// VAR

    }



    bool grad_1_NOT() {

        out << "grad_1_NOT()" << endl;

        if (elem->tip == NOT) {

            elem++;

            out << " NOT ";

            return !grad_0_PARAN_TRUE_FALSE_VAR();

        }

        bool rt = grad_0_PARAN_TRUE_FALSE_VAR();

        out << "rt = " << rt;

        return rt;

    }



    bool grad_2_AND() {

        out << "grad_1_AND()" << endl;

        bool rt = grad_1_NOT();

        while (elem->tip == AND) {

            out << " AND ";

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

        }

        return rt;

    }



    bool grad_3_OR() {

        out << "grad_1_OR()" << endl;

        bool rt = grad_2_AND();

        while (elem->tip == OR) {

            out << " OR ";

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

        }

        return rt;

    }

} expr;



bool Expresie::eval() {return grad_3_OR();}



int main() {

    expr.citeste();

    char chr;

    int n; in >> n;

    expr.arata_cod(); out << endl;

    while (n--) {

        in >> chr;

        val_variabila_set[chr] = !val_variabila_set[chr];

        elem = expr.elemente;

        out << expr.eval();

    }

}









//