Pagini recente » Cod sursa (job #121586) | Cod sursa (job #1878610) | Cod sursa (job #2940444) | Cod sursa (job #2981852) | Cod sursa (job #2165953)
#include <bits/stdc++.h>
using namespace std;
ifstream fi("bool.in");
ofstream fo("bool.out");
bool values[256];
string str, fliper;
int ptr, n;
static bool expression();
static bool priority_1();
static bool num();
static void advance() {
while (str[ptr] == ' ')
ptr+= 1; }
static bool _true(const int &ptr) {
return str[ptr] == 'T' && str[ptr + 1] == 'R'; }
static bool _false(const int &ptr) {
return str[ptr] == 'F' && str[ptr + 1] == 'A';}
static bool _and(const int &ptr) {
return str[ptr] == 'A' && str[ptr + 1] == 'N'; }
static bool _or(const int &ptr) {
return str[ptr] == 'O' && str[ptr + 1] == 'R'; }
static bool _not(const int &ptr) {
return str[ptr] == 'N' && str[ptr + 1] == 'O'; }
static bool expression() {
bool ant = priority_1();
advance();
while (_or(ptr)) {
ptr+= 2;
ant|= priority_1();
advance(); }
ptr+= 1;
return ant; }
static bool priority_1() {
bool ant = num();
advance();
while (_and(ptr)) {
ptr+= 3;
ant&= num();
advance(); }
return ant; }
static bool num() {
bool ant, flip = false;
advance();
while (_not(ptr)) {
flip^= 1;
ptr+= 3;
advance(); }
advance();
if (str[ptr] == '(') {
ptr+= 1;
return expression() ^ flip; }
if (_false(ptr)) {
ptr+= 5;
advance();
return false ^ flip; }
if (_true(ptr)) {
ptr+= 4;
advance();
return true ^ flip; }
ant = values[str[ptr++]] ^ flip;
advance();
return ant; }
int main() {
getline(fi, str);
fi >> n >> fliper;
for (auto ch: fliper) {
values[ch]^= 1;
ptr = 0;
fo << int(expression()); }
fo << endl;
return 0; }