#include <iostream>
#include <array>
struct BrainFuck {
std::array<uint8_t, 65536> mem;
uint16_t pos = 0;
};
struct Plus {
static int run(BrainFuck& bf) {
bf.mem[bf.pos]++;
return 0;
}
};
struct Minus {
static int run(BrainFuck& bf) {
bf.mem[bf.pos]--;
return 0;
}
};
struct Left {
static int run(BrainFuck& bf) {
bf.pos--;
return 0;
}
};
struct Right {
static int run(BrainFuck& bf) {
bf.pos++;
return 0;
}
};
struct In {
static int run(BrainFuck& bf) {
std::cin >> bf.mem[bf.pos];
return 0;
}
};
struct Out {
static int run(BrainFuck& bf) {
std::cout << bf.mem[bf.pos];
return 0;
}
};
template <typename T>
struct Loop {
static int run(BrainFuck& bf) {
while (bf.mem[bf.pos])
T::run(bf);
return 0;
}
};
template <typename... T>
void dummy(T... args) {
}
template <typename... T>
struct Seq {
static int run(BrainFuck& bf) {
int tmp[] = {T::run(bf)...};
return 0;
}
};
int main()
{
Seq<In, Plus, Out> test;
BrainFuck bf;
test.run(bf);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CgpzdHJ1Y3QgQnJhaW5GdWNrIHsKICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgNjU1MzY+IG1lbTsKICAgIHVpbnQxNl90IHBvcyA9IDA7Cn07CgpzdHJ1Y3QgUGx1cyB7CiAgICBzdGF0aWMgaW50IHJ1bihCcmFpbkZ1Y2smIGJmKSB7CiAgICAgICAgYmYubWVtW2JmLnBvc10rKzsKICAgICAgICByZXR1cm4gMDsKICAgIH0KfTsKCnN0cnVjdCBNaW51cyB7CiAgICBzdGF0aWMgaW50IHJ1bihCcmFpbkZ1Y2smIGJmKSB7CiAgICAgICAgYmYubWVtW2JmLnBvc10tLTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KfTsKCnN0cnVjdCBMZWZ0IHsKICAgIHN0YXRpYyBpbnQgcnVuKEJyYWluRnVjayYgYmYpIHsKICAgICAgICBiZi5wb3MtLTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KfTsKCnN0cnVjdCBSaWdodCB7CiAgICBzdGF0aWMgaW50IHJ1bihCcmFpbkZ1Y2smIGJmKSB7CiAgICAgICAgYmYucG9zKys7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn07CgpzdHJ1Y3QgSW4gewogICAgc3RhdGljIGludCBydW4oQnJhaW5GdWNrJiBiZikgewogICAgICAgIHN0ZDo6Y2luID4+IGJmLm1lbVtiZi5wb3NdOwogICAgICAgIHJldHVybiAwOwogICAgfQp9OwoKc3RydWN0IE91dCB7CiAgICBzdGF0aWMgaW50IHJ1bihCcmFpbkZ1Y2smIGJmKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IGJmLm1lbVtiZi5wb3NdOwogICAgICAgIHJldHVybiAwOwogICAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBMb29wIHsKICAgIHN0YXRpYyBpbnQgcnVuKEJyYWluRnVjayYgYmYpIHsKICAgICAgICB3aGlsZSAoYmYubWVtW2JmLnBvc10pCiAgICAgICAgICAgIFQ6OnJ1bihiZik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4Kdm9pZCBkdW1teShULi4uIGFyZ3MpIHsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFQ+CnN0cnVjdCBTZXEgewogICAgc3RhdGljIGludCBydW4oQnJhaW5GdWNrJiBiZikgewogICAgICAgIGludCB0bXBbXSA9IHtUOjpydW4oYmYpLi4ufTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgU2VxPEluLCBQbHVzLCBPdXQ+IHRlc3Q7CgogICAgQnJhaW5GdWNrIGJmOwogICAgdGVzdC5ydW4oYmYpOwoKICAgIHJldHVybiAwOwp9