Cod sursa(job #1840265)

Utilizator alexnekiNechifor Alexandru alexneki Data 4 ianuarie 2017 00:51:06
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.18 kb
#include <iostream>
#include <fstream>
#include <map>
#include <cassert>

using namespace std;

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

int const prmax = 3; //number of priority levels of the operators

int const nmax = 1001;
map<string, char> f;
map<char, int> prio;
map<char, bool> value;
char ex[nmax]; //expression to be evaluated
int n; //number of elements in clean expression

void read() {
  f["NOT"] = '!';
  f["AND"] = '&';
  f["OR"] = '|';
  f["TRUE"] = '1';
  f["FALSE"] = '2';

  prio['|'] = 0;
  prio['&'] = 1;
  prio['!'] = 2;

  char line[nmax];
  in.getline(line, nmax);

  char word[nmax];
  int wordp = 0, exp = 0; //pointers in word and expression
  int i = 0;
  while (line[i] != '\0') {
    if (line[i] == ' ' || line[i] == '(' || line[i] == ')') {

      //add word from stack first
      if (0 < wordp) {
        if (1 < wordp) { //special word
          word[wordp] = '\0'; //end word
          ex[exp] = f[word];
        } else { //just a letter
          ex[exp] = word[0];
          value[word[0]] = false;
        }
        wordp = 0; //clear stack
        exp++;
      }

      //then add the bracket, or just ignore the white space
      if (line[i] == '(' || line[i] == ')') {
        ex[exp] = line[i];
        exp++;
      }
    } else {
      word[wordp] = line[i];
      wordp++;
    }
    i++;
  }
  if (0 < wordp) {
    if (1 < wordp) { //special word
      word[wordp] = '\0'; //end word
      ex[exp] = f[word];
    } else { //just a letter
      ex[exp] = word[0];
      value[word[0]] = false;
    }
    wordp = 0; //clear word
    exp++;
  }
  ex[exp] = '\0'; //end expression
  value['1'] = true; //everything else is false in the beginning

  n = exp;
}

char currentChar;
int pointer = 0;

void readNextChar() {
  currentChar = ex[pointer];
  pointer++;
}

bool boolean() {
  bool result;
  if (currentChar == f["TRUE"]) {
    result = true;
  } else if (currentChar == f["FALSE"]) {
    result = false;
  } else {
    result = value[currentChar];
  }
//  cout<<"Boolean: "<<currentChar<<" -> "<<result<<endl;
  readNextChar();
  return result;
}

bool sau();

//Factor = !Factor, (Sau), bool
bool factor() {
  bool result;

//  cout<<"Factor: "<<currentChar<<" ";
  if (currentChar == '!') {
    readNextChar();
    result = !factor();
  } else if (currentChar == '(') {
    readNextChar();
    result = sau();
    readNextChar();
  } else {
    result = boolean();
  }
//  cout<<" -> "<<result<<endl;
  return result;
}

bool si();

//asociativitate la dreapta
//Sau = Si || Si || Si || ...
bool sau() {
  bool result = si();
  if (currentChar == '|') {
    readNextChar();
    result = result | sau();
  }
  return result;
}

//Si = Factor && Factor && Factor && ...
bool si() {
  bool result = factor();
  if (currentChar == '&') {
    readNextChar();
    result = result & si();
  }
  return result;
}

//Sau = Si || Si || Si || ...
//Si = Factor && Factor && Factor && ...
//Factor = !Factor, (Sau), bool
int main() {
  read();

  int nquery;
  in >> nquery;
  char letter;
  for (int i = 0; i < nquery; i++) {
    in >> letter;
    value[letter] = !value[letter];
    pointer = 0;
    readNextChar();
//    cout<<endl<<"i = "<<i<<endl;
    out << (int) sau();
  }
  out << endl;
  return 0;
}