Pagini recente » Cod sursa (job #260262) | Cod sursa (job #2513159) | Cod sursa (job #3182730) | Cod sursa (job #719274) | Cod sursa (job #648151)
Cod sursa(job #648151)
#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 evalx(int st, int en);
bool eval(int st, int en) {
bool result = evalx(st, en);
printf("%d %d [", st, en);
for (int i = st; i < en; ++i)
printf("%c", expr[i]);
printf("] -> %d\n", (int)result);
return result;
}
bool evalx(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);
}
}
{
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 + 2, 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 + 3, en);
}
}
}
if (st + 3 <= en && !strncmp(expr + st, "NOT", 3)) {
return !eval(st + 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", &n);
fgets(ch, sizeof(ch), fin);
for (int i = 0; i < n; ++i) {
val[ch[i] - 'A'] ^= 1;
fprintf(fout, "%d", eval(0, x) ? 1 : 0);
}
fprintf(fout, "\n");
fclose(fout);
fclose(fin);
return 0;
}