Cod sursa(job #2143563)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 26 februarie 2018 08:51:00
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fi("bool.in");
ofstream fo("bool.out");

char val[26];
string s;
string::iterator it;
int expresie();
int AND();
int numar();

int numar(){
  int semn = 1;
  while(*it == '!'){
    it++;//!
    semn = 1 - semn;
  }
  if(*it == '('){
    it++;//(
    int val = expresie();
    if(semn == 0)
      val = 1 - val;
    it++;//)
    return val;
  }
  int val = *it - '0';
  it++;//cifra
  if(semn == 0)
    val = 1 - val;
  return val;
}

int AND(){
  int val = numar();
  while(*it == '&'){
    it++;//&
    val = val & numar();
  }
  return val;
}

int expresie(){
  int val = AND();
  while(*it == '|'){
    it++;//|
    val = val | AND();
  }
  return val;
}

int main()
{
    string in;
    getline(fi, in);
    int n;
    char ch;
    fi >> n;
    for(int j = 0; j < n; j++){
        fi >> ch;
        val[ch - 'A'] = 1 - val[ch - 'A'];
        s.clear();
        for(auto it = in.begin(); it != in.end(); it++){
            if(*it == '(')
                s.push_back('(');
            else if(*it == ')')
                s.push_back(')');
            else if(*it != ' '){
                if(isalpha(*(it + 1))){
                    if(*it == 'A'){
                        s.push_back('&');
                        it += 2;
                    }
                    else if(*it == 'O'){
                        s.push_back('|');
                        it++;
                    }
                    else if(*it == 'N'){
                        s.push_back('!');
                        it += 2;
                    }
                    else if(*it == 'T'){
                        s.push_back('1');
                        it += 3;
                    }
                    else if(*it == 'F'){
                        s.push_back('0');
                        it += 4;
                    }
                }
                else
                    s.push_back(val[*it - 'A'] + '0');
            }
        }
        it = s.begin();
        fo << expresie();
    }
    return 0;
}