Cod sursa(job #1096296)

Utilizator IronWingVlad Paunescu IronWing Data 1 februarie 2014 20:36:05
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
/* 
 * File:   bool.cpp
 * Author: Vlad
 *
 * Created on February 1, 2014, 6:23 PM
 */

#include <cstdio>

using namespace std;

const int MAX_SIR = 100;

char sir[MAX_SIR + 1];
int variable[26];
int n;

inline bool isVar(char &c) {
    return c >= 'A' && c <= 'Z';
}

bool evalExpr(char *&exp);

bool token(char * & expr) {
    bool result = false;
    if (expr[0] == 'T' && expr[1] == 'R') {
        // TRUE
        result = true;
        expr += 4; // "TRUE"
    } else if (expr[0] == 'F' && expr[1] == 'A') {
        // TRUE
        result = false;
        expr += 5; // "FALSE"
    } else if (expr[0] == '(') {
        // (exp)
        expr++; // skip (
        result = evalExpr(expr);
        expr++; // skip )
        return result;
    } else if (expr[0] == 'N' && expr[1] == 'O') {
        // NOT
        expr += 4; // "NOT "
        result = !token(expr);
    } else if (isVar(expr[0])) {
        result = variable[expr[0] - 'A'];
        expr += 1;
    }
    return result;

}

bool evalExpr(char * &expr) {

    bool result = token(expr);;
    while (expr[1] == 'A' && expr[2] == 'N' ||
            expr[1] == 'O' && expr[2] == 'R') {
        if (expr[1] == 'A' && expr[2] == 'N') {
            // AND
            expr += 5; // " AND "
            bool right = token(expr);
            result = right && result;

        } else if (expr[1] == 'O' && expr[2] == 'R') {
            // AND
            expr += 4; // " OR "
            bool right = token(expr);
            result = right || result;
        }
    }
    return result;
}

int main(int argc, char** argv) {

    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);

    // citirea datelor
    gets(sir);
    scanf("%d\n", &n);

    char var;
    bool result = false;
    char *position;
    for (int i = 0; i < n; ++i) {
        scanf("%c", &var);
        variable[var - 'A'] = !variable[var - 'A'];
        position = sir;
        // if (var =='U')
        result = evalExpr(position);
        printf("%d", result);
    }
    printf("\n");
    return 0;
}