Cod sursa(job #648131)

Utilizator daniel.dumitranDaniel Dumitran daniel.dumitran Data 13 decembrie 2011 03:35:47
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define FISIN   "bool.in"
#define FISOUT  "bool.out"

char expr[1024];
char ch[128];
int n;
bool val[32];

bool eval(int st, int en) {
  while (expr[st] == ' ') ++st;
  while (strchr(" \r\n", expr[en - 1])) --en;

  if ((en - st) == 4 && !strncmp(expr + st, "TRUE", 4)) {
    return true;
  }

  if ((en - st) == 5 && !strncmp(expr + st, "FALSE", 5)) {
    return false;
  }

  if (en - st == 1) {
    return val[expr[st] - 'A'];
  }

  if (expr[st] == '(' && expr[en - 1] == ')') {
    int x = 1;
    for (int i = st + 1; i < en - 1; ++i) {
      if (expr[i] == '(')
	++x;
      else if (expr[i] == ')') {
	--x;
	if (!x) break;
      }
    }
    if (x) {
      return eval(st + 1, en - 1);
    }
  }

  if (st + 3 <= en && !strncmp(expr + st, "NOT", 3)) {
    return !eval(st + 3, en);
  }

  {
    int x = 0;
    for (int i = st; i < en; ++i) {
      if (expr[i] == '(')
	++x;
      else if (expr[i] == ')')
	--x;
      else if ((!x) && (st + 3 <= en) && (!strncmp(expr + i, "AND", 3))) {
	return eval(st, i) && eval(i + 4, en);
      }
    }
  }

  {
    int x = 0;
    for (int i = st; i < en; ++i) {
      if (expr[i] == '(')
	++x;
      else if (expr[i] == ')')
	--x;
      else if ((!x) && (st + 2 <= en) && (!strncmp(expr + i, "OR", 2))) {
	return eval(st, i) || eval(i + 3, en);
      }
    }
  }

  printf("BUG.... %d %d\n", st, en);
  for (int i = st; i < en; ++i)
    printf("%c", expr[i]);
  printf("\n");

  for (;;);
  return false;

}

int main() {
  FILE *fin = fopen(FISIN, "rt");
  FILE *fout = fopen(FISOUT, "wt");

  fgets(expr, sizeof(expr), fin);
  int x = strlen(expr);
  while (expr[x - 1] == '\r' || expr[x - 1] == '\n')
    expr[x - 1] = 0;

  fscanf(fin, "%d", &n);
  fscanf(fin, "%s", ch);

  for (int i = 0; i < n; ++i) {
    val[ch[i] - 'A'] ^= 1;
    fprintf(fout, "%d", eval(0, x) ? 1 : 0);
  }

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