#include <iostream>
#include <vector>
#include <stack>
#include <unordered_map>
#include <string>
void executeBrainfuck(const std::string& code, const std::string& input) {
const int MEMORY_SIZE = 30000;
std::vector<unsigned char> memory(MEMORY_SIZE, 0);
int pointer = 0;
std::string output;
std::unordered_map<int, int> loopStartToEnd;
std::unordered_map<int, int> loopEndToStart;
std::stack<int> bracketStack;
for (int i = 0; i < code.size(); ++i) {
if (code[i] == '[') {
bracketStack.push(i);
} else if (code[i] == ']') {
int start = bracketStack.top();
bracketStack.pop();
loopStartToEnd[start] = i;
loopEndToStart[i] = start;
}
}
int inputIndex = 0;
for (int i = 0; i < code.size(); ++i) {
char command = code[i];
switch (command) {
case '>':
pointer = (pointer + 1) % MEMORY_SIZE;
break;
case '<':
pointer = (pointer - 1 + MEMORY_SIZE) % MEMORY_SIZE;
break;
case '+':
memory[pointer] = (memory[pointer] + 1) % 256;
break;
case '-':
memory[pointer] = (memory[pointer] - 1 + 256) % 256;
break;
case '.':
output += static_cast<char>(memory[pointer]);
break;
case ',':
if (inputIndex < input.size()) {
memory[pointer] = static_cast<unsigned char>(input[inputIndex]);
++inputIndex;
} else {
memory[pointer] = 0;
}
break;
case '[':
if (memory[pointer] == 0) {
i = loopStartToEnd[i];
}
break;
case ']':
if (memory[pointer] != 0) {
i = loopEndToStart[i];
}
break;
}
}
std::cout << output;
}
int main() {
std::string code;
std::string inputBuffer;
std::string line;
while (std::getline(std::cin, line) && line != "$") {
code += line + '\n';
}
if (std::getline(std::cin, line) && !line.empty()) {
size_t spacePos = line.find(' ');
if (spacePos != std::string::npos) {
inputBuffer = line.substr(spacePos + 1);
}
}
executeBrainfuck(code, inputBuffer);
return 0;
}