Pagini recente » Cod sursa (job #2099896) | Cod sursa (job #963338) | Cod sursa (job #768093) | Cod sursa (job #2199047) | Cod sursa (job #2843577)
//
// main.cpp
// Bool (infoarena)
//
// Created by Andrei Bădulescu on 02.02.22.
//
#include <fstream>
#include <cstring>
#include <cctype>
using namespace std;
ifstream in("bool.in");
ofstream out("bool.out");
char s[100005], aux[100001];
int p = 0, paux = 0;
bool var[30], result;
void replacement() {
while (s[p] != '\0') {
if (s[p] == 'A' && s[p + 1] == 'N') {
aux[paux] = '&';
s[p + 1] = ' ';
s[p + 2] = ' ';
paux++;
p += 2;
} else if (s[p] == 'O' && s[p + 1] == 'R') {
aux[paux] = '|';
s[p + 1] = ' ';
paux++;
p++;
} else if (s[p] == 'N' && s[p + 1] == 'O') {
aux[paux] = '!';
s[p + 1] = ' ';
s[p + 2] = ' ';
paux++;
p += 2;
} else if ((s[p] == 'T' && s[p + 1] == 'R') || (s[p] == 'F' && s[p + 1] == 'A')) {
if (s[p] == 'T') {
aux[paux] = '1';
s[p + 1] = ' ';
s[p + 2] = ' ';
s[p + 3] = ' ';
paux++;
p += 3;
} else {
aux[paux] = '0';
s[p + 1] = ' ';
s[p + 2] = ' ';
s[p + 3] = ' ';
s[p + 4] = ' ';
paux++;
p += 4;
}
} else if (isupper(s[p])) {
aux[paux] = s[p];
paux++;
} else if (s[p] == ')' || s[p] == '(') {
aux[paux] = s[p];
paux++;
}
p++;
}
}
int expresie();
int termen();
int factor();
int expresie() {
int first = termen();
while (s[p] == '&') {
p++;
int temp = termen();
if (first > 0) {
result = var[first];
} else if (first == 0) {
result = false;
} else if (first == -1) {
result = true;
}
if (temp > 0) {
result = result && var[temp];
} else if (temp == 0) {
result = false;
} else if (temp == -1) {
result = result && true;
}
if (first > 0 || temp > 0) {
out << result;
}
if (temp > 0) {
first = temp;
var[first] = result;
}
}
if (first > 0)
return first;
if (result)
return -1;
return 0;
}
int termen() {
int first = factor();
while(s[p] == '|') {
p++;
int temp = termen();
if (first > 0) {
result = var[first];
} else if (first == 0) {
result = false;
} else if (first == -1) {
result = true;
}
if (temp > 0) {
result = result || var[temp];
} else if (temp == 0) {
result = result || false;
} else if (temp == -1) {
result = true;
}
if (first > 0 || temp > 0) {
out << result;
}
if (temp > 0) {
first = temp;
var[first] = result;
}
}
if (first > 0)
return first;
if (result)
return -1;
return 0;
}
int factor() {
int sign = 1, val;
while(s[p] == '!') {
sign *= -1;
p++;
}
if (s[p] == '(') {
p++;
val = expresie();
p++;
if (val > 0) {
if (sign == -1) {
var[val] = !var[val];
}
return val;
} else if (val == 0) {
if (sign == -1) {
return -1;
}
return 0;
} else if (val == -1) {
if (sign == -1) {
return 0;
}
return -1;
}
}
if ('A' <= s[p] && s[p] <= 'Z') {
val = s[p] - 'A' + 1;
p++;
if (sign == - 1) {
var[val] = !var[val];
out << var[val];
}
return val;
}
if (s[p] == '1') {
if (sign == -1) {
return 0;
}
return -1;
}
if (sign == -1) {
return -1;
}
return 0;
}
int main() {
in.getline(s, 100000);
replacement();
strcpy(s, aux);
p = 0;
expresie();
return 0;
}