#include #include #include #include #include #include #include using namespace std; #define PRINTF(args...) printf(args) //#define PRINTF(args...) #define FOR(i,a,b) for(int i=(a); i<(int)(b); ++i) #define FORD(i,a,b) for(int i=(a)-1; i>=(int)(b); --i) #define FOREACH(i,C) for(__typeof(C.begin()) i=C.begin(); i!=C.end(); ++i) struct el { int x, y, dx, dy, wart; el(int a=0, int b=0, int c=0, int d=0, int e=0):x(a),y(b),dx(c),dy(d),wart(e){} }; int n, m; char mapa[205][205], tmp[205], rodzajbr[205*205]; int bramka[205][205], brwsp[205*205][2], wys[205*205], szer[205*205], ilebr, wejsc[205*205], literka[26]; int visited[205][205][3][3], sumabramki[205*205]; queue kol; bool jest(const el &akt) { //FIXME druga strona if(akt.x < 0 || akt.y < 0 || akt.x >= n || akt.y >= m) return true; return visited[akt.x][akt.y][akt.dx+1][akt.dy+1]; } void wrzuc(int x, int y, int dx, int dy, int wart) { el tmp(x,y,dx,dy,wart); if(jest(tmp)) return ; visited[x][y][dx+1][dy+1] = 1; kol.push(tmp); } void wrzuc(const el &tmp) { // el tmp(x,y,dx,dy,wart); if(jest(tmp)) return ; visited[tmp.x][tmp.y][tmp.dx+1][tmp.dy+1] = 1; kol.push(tmp); } void poziom(const el &akt) { if(akt.dx) return ; wrzuc(el(akt.x, akt.y + akt.dy, akt.dx, akt.dy, akt.wart)); } void pion(const el &akt) { if(akt.dy) return ; wrzuc(el(akt.x + akt.dx, akt.y, akt.dx, akt.dy, akt.wart)); } void Plus(const el &akt) { for(int i = -1; i <= 1; ++i) for(int j = -1; j <= 1; ++j) if(abs(i) + abs(j) == 1) wrzuc(el(akt.x + i, akt.y + j, i, j, akt.wart)); } void rowne(const el &akt) { if(akt.dy==1) wrzuc(el(akt.x, akt.y + akt.dy, akt.dx, akt.dy, akt.wart)); } void neg(const el &akt) { if(akt.dy==1) wrzuc(el(akt.x,akt.y+1,0,1,1-akt.wart)); } void wejbram(const el &akt) { if(akt.dy!=1) return; int nr = bramka[akt.x][akt.y]; if(nr < 0) return ; --wejsc[nr]; if(rodzajbr[nr] == 0) sumabramki[nr] &= akt.wart; if(rodzajbr[nr] == 1) sumabramki[nr] |= akt.wart; if(rodzajbr[nr] == 2) sumabramki[nr] ^= akt.wart; if(wejsc[nr] != 0) return ; for(int i = 0; i < wys[nr]; ++i) wrzuc(el(brwsp[nr][0] + i, brwsp[nr][1] + szer[nr], 0, 1, sumabramki[nr])); } void koniec(const el &akt) { if(akt.dy==1) literka[ mapa[akt.x][akt.y] - 'A' ] = akt.wart; } void iks(const el &akt) { wrzuc(el(akt.x+akt.dx, akt.y+akt.dy, akt.dx, akt.dy, akt.wart)); } bool sciagamy() { if(kol.empty()) return false; el akt = kol.front(); kol.pop(); int tx = akt.x, ty = akt.y; if(mapa[tx][ty] == '-') poziom(akt); else if(mapa[tx][ty] == '|') pion(akt); else if(mapa[tx][ty] == '+') Plus(akt); else if(mapa[tx][ty] == 'x') iks(akt); else if(mapa[tx][ty] == '=') rowne(akt); else if(mapa[tx][ty] == 'o') neg(akt); else if(mapa[tx][ty] == '#') wejbram(akt); else if(isupper(mapa[tx][ty])) koniec(akt); return true; } bool testcase() { n = m = 0; memset(mapa,' ',sizeof(mapa)); while(true) { fgets(tmp,sizeof(tmp),stdin); if(tmp[0] == '*') break; int tm = strlen(tmp); for(int i = 0; i < tm; ++i) mapa[n][i] = tmp[i]; m >?= tm; ++n; } if(n == 0) return false; memset(bramka,-1,sizeof(bramka)); memset(literka,-1,sizeof(literka)); memset(visited,0,sizeof(visited)); ilebr = 0; for(int i = 0; i < n; ++i) for(int j = 0; j < m; ++j) if(bramka[i][j] == -1 && mapa[i][j] == '#') { wys[ilebr] = szer[ilebr] = 1; brwsp[ilebr][0] = i; brwsp[ilebr][1] = j; while(j + szer[ilebr] < m && mapa[i][j+szer[ilebr]] == '#') ++szer[ilebr]; while(i + wys[ilebr] < n && mapa[i+wys[ilebr]][j] == '#') ++wys[ilebr]; for(int k = 0; k < wys[ilebr]; ++k) for(int l = 0; l < szer[ilebr]; ++l) { if(mapa[i+k][j+l] == '&') { rodzajbr[ilebr] = 0; // AND sumabramki[ilebr] = 1; } if(mapa[i+k][j+l] == '1') { rodzajbr[ilebr] = 1; // OR sumabramki[ilebr] = 0; } if(mapa[i+k][j+l] == '=') { rodzajbr[ilebr] = 2; // XOR sumabramki[ilebr] = 0; } bramka[i+k][j+l] = ilebr; } wejsc[ilebr] = 0; if(j == 0 || j + szer[ilebr] == m) { ++ilebr; continue; } for(int k = 0; k < wys[ilebr]; ++k) { if(mapa[i+k][j-1] == '=') ++wejsc[ilebr]; } ++ilebr; } for(int i = 0; i < n; ++i) for(int j = 0; j < m; ++j) if(mapa[i][j] == '0' || mapa[i][j] == '1') { wrzuc(i, j+1, 0, 1, mapa[i][j]-'0'); } while(sciagamy()); for(int i = 0; i < 26; ++i) if(literka[i] != -1) printf("%c=%d\n",i+'A',literka[i]); printf("\n"); return true; } int main() { while(testcase()); return 0; }