#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;
}
};
template <typename... R>
auto operator+(Seq<R...> r) {
return Seq<Plus, R...>();
}
template <typename... R>
auto operator-(Seq<R...> r) {
return Seq<Minus, R...>();
}
template <typename... R>
auto operator++(Seq<R...> r) {
return Seq<Right, R...>();
}
template <typename... R>
auto operator--(Seq<R...> r) {
return Seq<Left, R...>();
}
template <typename... R>
auto operator*(Seq<R...> r) {
return Seq<Out, R...>();
}
template <typename... R>
auto operator&(Seq<R...> r) {
return Seq<In, R...>();
}
struct LoopEnd {
};
template <typename... R>
auto operator~(Seq<R...> r) {
return Seq<LoopEnd, R...>();
}
template <typename... R, typename... S>
auto cutLoop(Loop<Seq<S...>>, Seq<LoopEnd, R...>) {
return Seq<Loop<Seq<S...>>, R...>();
}
template <typename T, typename... R, typename... S>
typename std::enable_if<!std::is_same<T, LoopEnd>::value, decltype(cutLoop(Loop<Seq<S..., T>>(), Seq<R...>()))>::type cutLoop(Loop<Seq<S...>>, Seq<T, R...>) {
return cutLoop(Loop<Seq<S..., T>>(), Seq<R...>());
}
template <typename... R>
auto operator!(Seq<R...> r) {
return cutLoop(Loop<Seq<>>(), Seq<R...>());
}
template <typename... R>
void operator>>(Seq<R...> r, BrainFuck b) {
r.run(b);
}
#define BRAINFUCK Seq<>() >> BrainFuck()
int main()
{
+ ! - ! -- -- ! + ! - - - ++ ~ - ! -- -- -- ~ ~ ~ ++ ++ ++ - ~ ++ - * - - -
* ++ * * ++ * -- -- -- -- - * -- + * ++ ++ ++ ++ ++ * ++ * -- -- * -- - *
BRAINFUCK;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CgpzdHJ1Y3QgQnJhaW5GdWNrIHsKICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgNjU1MzY+IG1lbTsKICAgIHVpbnQxNl90IHBvcyA9IDA7Cn07CgpzdHJ1Y3QgUGx1cyB7CiAgICBzdGF0aWMgaW50IHJ1bihCcmFpbkZ1Y2smIGJmKSB7CiAgICAgICAgYmYubWVtW2JmLnBvc10rKzsKICAgICAgICByZXR1cm4gMDsKICAgIH0KfTsKCnN0cnVjdCBNaW51cyB7CiAgICBzdGF0aWMgaW50IHJ1bihCcmFpbkZ1Y2smIGJmKSB7CiAgICAgICAgYmYubWVtW2JmLnBvc10tLTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KfTsKCnN0cnVjdCBMZWZ0IHsKICAgIHN0YXRpYyBpbnQgcnVuKEJyYWluRnVjayYgYmYpIHsKICAgICAgICBiZi5wb3MtLTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KfTsKCnN0cnVjdCBSaWdodCB7CiAgICBzdGF0aWMgaW50IHJ1bihCcmFpbkZ1Y2smIGJmKSB7CiAgICAgICAgYmYucG9zKys7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn07CgpzdHJ1Y3QgSW4gewogICAgc3RhdGljIGludCBydW4oQnJhaW5GdWNrJiBiZikgewogICAgICAgIHN0ZDo6Y2luID4+IGJmLm1lbVtiZi5wb3NdOwogICAgICAgIHJldHVybiAwOwogICAgfQp9OwoKc3RydWN0IE91dCB7CiAgICBzdGF0aWMgaW50IHJ1bihCcmFpbkZ1Y2smIGJmKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IGJmLm1lbVtiZi5wb3NdOwogICAgICAgIHJldHVybiAwOwogICAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBMb29wIHsKICAgIHN0YXRpYyBpbnQgcnVuKEJyYWluRnVjayYgYmYpIHsKICAgICAgICB3aGlsZSAoYmYubWVtW2JmLnBvc10pCiAgICAgICAgICAgIFQ6OnJ1bihiZik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4Kdm9pZCBkdW1teShULi4uIGFyZ3MpIHsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFQ+CnN0cnVjdCBTZXEgewogICAgc3RhdGljIGludCBydW4oQnJhaW5GdWNrJiBiZikgewogICAgICAgIGludCB0bXBbXSA9IHsgVDo6cnVuKGJmKS4uLiB9OwogICAgICAgIHJldHVybiAwOwogICAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFI+CmF1dG8gb3BlcmF0b3IrKFNlcTxSLi4uPiByKSB7CiAgICByZXR1cm4gU2VxPFBsdXMsIFIuLi4+KCk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZS4uLiBSPgphdXRvIG9wZXJhdG9yLShTZXE8Ui4uLj4gcikgewogICAgcmV0dXJuIFNlcTxNaW51cywgUi4uLj4oKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFI+CmF1dG8gb3BlcmF0b3IrKyhTZXE8Ui4uLj4gcikgewogICAgcmV0dXJuIFNlcTxSaWdodCwgUi4uLj4oKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFI+CmF1dG8gb3BlcmF0b3ItLShTZXE8Ui4uLj4gcikgewogICAgcmV0dXJuIFNlcTxMZWZ0LCBSLi4uPigpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gUj4KYXV0byBvcGVyYXRvciooU2VxPFIuLi4+IHIpIHsKICAgIHJldHVybiBTZXE8T3V0LCBSLi4uPigpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gUj4KYXV0byBvcGVyYXRvciYoU2VxPFIuLi4+IHIpIHsKICAgIHJldHVybiBTZXE8SW4sIFIuLi4+KCk7Cn0KCnN0cnVjdCBMb29wRW5kIHsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZS4uLiBSPgphdXRvIG9wZXJhdG9yfihTZXE8Ui4uLj4gcikgewogICAgcmV0dXJuIFNlcTxMb29wRW5kLCBSLi4uPigpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gUiwgdHlwZW5hbWUuLi4gUz4KYXV0byBjdXRMb29wKExvb3A8U2VxPFMuLi4+PiwgU2VxPExvb3BFbmQsIFIuLi4+KSB7CiAgICByZXR1cm4gU2VxPExvb3A8U2VxPFMuLi4+PiwgUi4uLj4oKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFIsIHR5cGVuYW1lLi4uIFM+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX3NhbWU8VCwgTG9vcEVuZD46OnZhbHVlLCBkZWNsdHlwZShjdXRMb29wKExvb3A8U2VxPFMuLi4sIFQ+PigpLCBTZXE8Ui4uLj4oKSkpPjo6dHlwZSBjdXRMb29wKExvb3A8U2VxPFMuLi4+PiwgU2VxPFQsIFIuLi4+KSB7CiAgICByZXR1cm4gY3V0TG9vcChMb29wPFNlcTxTLi4uLCBUPj4oKSwgU2VxPFIuLi4+KCkpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gUj4KYXV0byBvcGVyYXRvciEoU2VxPFIuLi4+IHIpIHsKICAgIHJldHVybiBjdXRMb29wKExvb3A8U2VxPD4+KCksIFNlcTxSLi4uPigpKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFI+CnZvaWQgb3BlcmF0b3I+PihTZXE8Ui4uLj4gciwgQnJhaW5GdWNrIGIpIHsKCXIucnVuKGIpOwp9CgojZGVmaW5lIEJSQUlORlVDSyBTZXE8PigpID4+IEJyYWluRnVjaygpCgppbnQgbWFpbigpCnsKICAgICsgISAtICEgLS0gLS0gISArICEgLSAtIC0gKysgfiAtICEgLS0gLS0gLS0gfiB+IH4gKysgKysgKysgLSB+ICsrIC0gKiAtIC0gLQogICAgKiArKyAqICogKysgKiAtLSAtLSAtLSAtLSAtICogLS0gKyAqICsrICsrICsrICsrICsrICogKysgKiAtLSAtLSAqIC0tIC0gKgogICAgCiAgICBCUkFJTkZVQ0s7CiAgICAKICAgIHJldHVybiAwOwp9