Cod sursa(job #1570711)

Utilizator stoianmihailStoian Mihail stoianmihail Data 16 ianuarie 2016 19:26:23
Problema Bool Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <stdio.h>
#include <ctype.h>

#define Nadejde 1005
#define SIGMA 26

/** Gramatica expresiei, problema "Bool":
 * E = T | T + '|' + T + ... + '|' + T.
 * T = F | F + '&' + F + ... + '&' + F.
 * F = litera mare | 0 | 1 | '(' + E + ')' | !F.

 * Multumim Doamne!
**/

int bit[SIGMA];
int N, buff, pos;
char s[Nadejde + 5];

/** Pune in s caracterul c. **/
void push(int *i, char c, int delta) {
  s[buff++] = c;
  (*i) += delta;
}

/** Transforma sirul dat intr-o forma mai simpla. **/
void init() {
  int i;

  for (i = 0; s[i] != '\0'; i++) {
    /* AND. */
    if (s[i] == 'A') {
      if (s[i + 1] == 'N') {
        push(&i, '&', 2);
      } else {
        push(&i, 'A', 0);
      }
    /* OR. */
    } else if (s[i] == 'O') {
      if (s[i + 1] == 'R') {
        push(&i, '|', 1);
      } else {
        push(&i, 'O', 0);
      }
    /* NOT. */
    } else if (s[i] == 'N') {
      if (s[i + 1] == 'O') {
        push(&i, '!', 2);
      } else {
        push(&i, 'N', 0);
      }
    /* TRUE. */
    } else if (s[i] == 'T') {
      if (s[i + 1] == 'R') {
        push(&i, '1', 3);
      } else {
        push(&i, 'T', 0);
      }
    /* FALSE. */
    } else if (s[i] == 'F') {
      if (s[i + 1] == 'A') {
        push(&i, '0', 4);
      } else {
        push(&i, 'F', 0);
      }
    /* Alt caracter care nu e spatiu. */
    } else if (s[i] != ' ') {
      push(&i, s[i], 0);
    }
  }
  s[buff] = '\0';
}

int E(), T(), F();

/** Evalueaza o expresie. **/
int E() {
  int result = T();

  while (s[pos] == '|') {
    pos++;
    result |= T();
  }
  return result;
}

/** Evalueaza un termen. **/
int T() {
  int result = F();

  while (s[pos] == '&') {
    pos++;
    result &= F();
  }
  return result;
}

/** Evalueaza un factor. **/
int F() {
  int result = 0;

  if (isupper(s[pos])) {
    result = bit[s[pos++] - 'A'];
  } else if (s[pos] == '0') {
    pos++;
    result = 0;
  } else if (s[pos] == '1') {
    pos++;
    result = 1;
  } else if (s[pos] == '(') {
    pos++;
    result = E();
    pos++;
  } else if (s[pos] == '!') {
    pos++;
    result = !F();
  }
  return result;
}

int main(void) {
  int c;
  FILE *f = fopen("bool.in", "r");

  /* Citirea datelor. */
  fgets(s, Nadejde, f);
  init();

  /* Calcularea solutiei si afisarea ei. */
  freopen("bool.out", "w", stdout);
  for (fscanf(f, "%d\n", &N); N; N--) {
    c = fgetc(f) - 'A';
    bit[c] = !bit[c];
    pos = 0;
    fprintf(stdout, "%d", E());
  }
  fclose(f);
  fclose(stdout);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}