Cod sursa(job #2843577)

Utilizator AndreiBadAndrei Badulescu AndreiBad Data 2 februarie 2022 18:02:35
Problema Bool Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.38 kb
//
//  main.cpp
//  Bool (infoarena)
//
//  Created by Andrei Bădulescu on 02.02.22.
//

#include <fstream>
#include <cstring>
#include <cctype>

using namespace std;

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

char s[100005], aux[100001];
int p = 0, paux = 0;
bool var[30], result;

void replacement() {
    while (s[p] != '\0') {
        if (s[p] == 'A' && s[p + 1] == 'N') {
            aux[paux] = '&';
            s[p + 1] = ' ';
            s[p + 2] = ' ';
            paux++;
            p += 2;
        } else if (s[p] == 'O' && s[p + 1] == 'R') {
            aux[paux] = '|';
            s[p + 1] = ' ';
            paux++;
            p++;
        } else if (s[p] == 'N' && s[p + 1] == 'O') {
            aux[paux] = '!';
            s[p + 1] = ' ';
            s[p + 2] = ' ';
            paux++;
            p += 2;
        } else if ((s[p] == 'T' && s[p + 1] == 'R') || (s[p] == 'F' && s[p + 1] == 'A')) {
            if (s[p] == 'T') {
                aux[paux] = '1';
                s[p + 1] = ' ';
                s[p + 2] = ' ';
                s[p + 3] = ' ';
                paux++;
                p += 3;
            } else {
                aux[paux] = '0';
                s[p + 1] = ' ';
                s[p + 2] = ' ';
                s[p + 3] = ' ';
                s[p + 4] = ' ';
                paux++;
                p += 4;
            }
        } else if (isupper(s[p])) {
            aux[paux] = s[p];
            paux++;
        } else if (s[p] == ')' || s[p] == '(') {
            aux[paux] = s[p];
            paux++;
        }
        p++;
    }
}

int expresie();
int termen();
int factor();

int expresie() {
    int first = termen();
    
    while (s[p] == '&') {
        p++;
        int temp = termen();
        
        if (first > 0) {
            result = var[first];
        } else if (first == 0) {
            result = false;
        } else if (first == -1) {
            result = true;
        }
        
        if (temp > 0) {
            result = result && var[temp];
        } else if (temp == 0) {
            result = false;
        } else if (temp == -1) {
            result = result && true;
        }
        
        if (first > 0 || temp > 0) {
            out << result;
        }
        
        if (temp > 0) {
            first = temp;
            var[first] = result;
        }
    }
    
    if (first > 0)
        return first;
    
    if (result)
        return -1;
    
    return 0;
}

int termen() {
    int first = factor();
    
    while(s[p] == '|') {
        p++;
        int temp = termen();
        
        if (first > 0) {
            result = var[first];
        } else if (first == 0) {
            result = false;
        } else if (first == -1) {
            result = true;
        }
        
        if (temp > 0) {
            result = result || var[temp];
        } else if (temp == 0) {
            result = result || false;
        } else if (temp == -1) {
            result = true;
        }
        
        if (first > 0 || temp > 0) {
            out << result;
        }
        
        if (temp > 0) {
            first = temp;
            var[first] = result;
        }
    }
    
    if (first > 0)
        return first;
    
    if (result)
        return -1;
    
    return 0;
}

int factor() {
    int sign = 1, val;
    
    while(s[p] == '!') {
        sign *= -1;
        p++;
    }
    
    if (s[p] == '(') {
        p++;
        val = expresie();
        p++;
        if (val > 0) {
            if (sign == -1) {
                var[val] = !var[val];
            }
            
            return val;
        
        } else if (val == 0) {
            if (sign == -1) {
                return -1;
            }
            
            return 0;
        
        } else if (val == -1) {
            if (sign == -1) {
                return 0;
            }
            
            return -1;
        }
    }
    
    if ('A' <= s[p] && s[p] <= 'Z') {
        val = s[p] - 'A' + 1;
        p++;
        
        if (sign == - 1) {
            var[val] = !var[val];
            out << var[val];
        }
        
        return val;
    }
    
    if (s[p] == '1') {
        if (sign == -1) {
            return 0;
        }
        
        return -1;
    }
    
    if (sign == -1) {
        return -1;
    }
    
    return 0;
}

int main() {
    in.getline(s, 100000);
    replacement();
    strcpy(s, aux);
    p = 0;
    expresie();
    return 0;
}