Cod sursa(job #3174603)

Utilizator paaull69Ion Paul paaull69 Data 24 noiembrie 2023 23:57:42
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <stdio.h>
#include <string.h>

#define FALSE 26
#define TRUE 27

#define MAX_L 28
bool values[MAX_L];

#define MAX_S 1000
char s[MAX_S];
int sLength;
int sIndex;

void simplify(char s[], int& sLength) {
  int i, j;

  i = 1, j = 1;
  while (j < sLength) {
    if (s[j - 1] == 'N' && s[j] == 'D') {
      s[i - 2] = '&';
      i = i - 1;
    } else if (s[j - 1] == 'O' && s[j] == 'R')
      s[i - 1] = '|';
    else if (s[j - 1] == 'O' && s[j] == 'T') {
      s[i - 2] = '!';
      i = i - 1;
    } else if (s[j - 1] == 'S' && s[j] == 'E') {
      s[i - 4] = 'A' + FALSE;
      i = i - 3;
    } else if (s[j - 1] == 'U' && s[j] == 'E') {
      s[i - 3] = 'A' + TRUE;
      i = i - 2;
    } else if (s[j] != ' ')
      s[i++] = s[j];

    ++j;
  }

  s[sLength = i] = 0;
}

bool evaluate_or();

bool factor() {
  bool factor;
  bool shouldNegate;

  shouldNegate = false;
  while (s[sIndex] == '!') {
    shouldNegate = !shouldNegate;
    sIndex++;
  }

  factor = 0;
  if (s[sIndex] == '(') {
    ++sIndex;
    factor = evaluate_or();
    ++sIndex;
  } else
    factor = values[s[sIndex++] - 'A'];

  return shouldNegate ? !factor : factor;
}

bool evaluare_and() {
  bool result;

  result = factor();
  while (s[sIndex] == '&') {
    ++sIndex;
    result &= factor();
  }

  return result;
}

bool evaluate_or() {
  bool result;

  result = evaluare_and();
  while (s[sIndex] == '|') {
    ++sIndex;
    result |= evaluare_and();
  }

  return result;
}

bool evaluate() {
  sIndex = 0;
  return evaluate_or();
}

int main() {
  FILE *fin, *fout;
  fin = fopen("bool.in", "r");
  fout = fopen("bool.out", "w");

  int q;
  char ch;

  fgets(s, MAX_S + 1, fin);
  sLength = strlen(s);

  simplify(s, sLength);

  values[TRUE] = true;
  values[FALSE] = false;

  fscanf(fin, "%d\n", &q);
  while (q--) {
    ch = fgetc(fin);
    values[ch - 'A'] = !values[ch - 'A'];

    fprintf(fout, "%d", evaluate());
  }

  fputc('\n', fout);

  fclose(fin);
  fclose(fout);
  return 0;
}