Pagini recente » Cod sursa (job #717401) | Cod sursa (job #2276158) | Cod sursa (job #3337880) | Cod sursa (job #1085154) | Cod sursa (job #3337632)
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
string line0;
char line[1001];
int f[30][1001]; // f[var][0] = număr apariții, f[var][1..] = poziții în line[]
int p;
bool expresie();
bool AndFunction();
bool factor();
bool expresie() {
bool sum = AndFunction();
while (line[p] == '|') {
p++;
sum = sum || AndFunction();
}
return sum;
}
bool AndFunction() {
bool sum = factor();
while (line[p] == '&') {
p++;
sum = sum && factor();
}
return sum;
}
bool factor() {
int negatii = 0;
while (line[p] == '!') {
negatii++;
p++;
}
bool val;
if (line[p] == '(') {
p++;
val = expresie();
if (line[p] == ')') p++; // consumăm ) dacă există (mai sigur)
} else if (line[p] == '1') {
val = true;
p++;
} else if (line[p] == '0') {
val = false;
p++;
} else {
// eroare? dar pentru robustețe returnăm false
p++;
val = false;
}
if (negatii % 2 == 1) val = !val;
return val;
}
int main() {
getline(fin, line0);
int i = 0;
p = 0;
int n = line0.size();
while (i < n) {
if (line0[i] == ' ') { // eliminăm spațiile
i++;
continue;
}
if (i + 2 < n && line0[i] == 'A' && line0[i+1] == 'N' && line0[i+2] == 'D') {
line[p++] = '&';
i += 3;
}
else if (i + 1 < n && line0[i] == 'O' && line0[i+1] == 'R') {
line[p++] = '|';
i += 2;
}
else if (i + 2 < n && line0[i] == 'N' && line0[i+1] == 'O' && line0[i+2] == 'T') {
line[p++] = '!';
i += 3;
}
else if (i + 3 < n && line0[i] == 'T' && line0[i+1] == 'R' &&
line0[i+2] == 'U' && line0[i+3] == 'E') {
line[p++] = '1';
i += 4;
}
else if (i + 4 < n && line0[i] == 'F' && line0[i+1] == 'A' &&
line0[i+2] == 'L' && line0[i+3] == 'S' && line0[i+4] == 'E') {
line[p++] = '0';
i += 5;
}
else if (line0[i] >= 'A' && line0[i] <= 'Z') {
int idx = line0[i] - 'A';
f[idx][0]++;
f[idx][f[idx][0]] = p;
line[p++] = '0'; // inițial false
i++;
}
else if (line0[i] == '(' || line0[i] == ')') {
line[p++] = line0[i];
i++;
}
else {
i++; // ignorăm caractere necunoscute (dar nu ar trebui să existe)
}
}
line[p] = '\0'; // terminăm șirul (bun pentru siguranță)
int k;
fin >> k;
string mods;
getline(fin, mods); // consumă restul liniei după k
getline(fin, mods); // citim linia cu literele (A B C ...)
for (char ch : mods) {
if (ch < 'A' || ch > 'Z') continue;
int idx = ch - 'A';
for (int j = 1; j <= f[idx][0]; j++) {
int poz = f[idx][j];
line[poz] = (line[poz] == '0') ? '1' : '0';
}
p = 0;
fout << (expresie() ? '1' : '0');
}
fout << endl;
return 0;
}