#include <cstdint>
#include <fstream>
#include <iostream>
#include <string>
const std::string program = R"(
+++++ +++++ initialize counter (cell #0) to 10
[ use loop to set the next four cells to 70/100/30/10
> +++++ ++ add 7 to cell #1
> +++++ +++++ add 10 to cell #2
> +++ add 3 to cell #3
> + add 1 to cell #4
<<<< - decrement counter (cell #0)
]
> ++ . print 'H'
> + . print 'e'
+++++ ++ . print 'l'
. print 'l'
+++ . print 'o'
> ++ . print ' '
<< +++++ +++++ +++++ . print 'W'
> . print 'o'
+++ . print 'r'
----- - . print 'l'
----- --- . print 'd'
> + . print '!'
> . print '\n'
)";
uint8_t memory[30000];
void execute(const std::string& program) {
auto it = program.begin(), eof = program.end();
uint8_t* ptr = memory;
while (it != eof) {
if (*it == '>') ptr++;
if (*it == '<') ptr--;
if (*it == '+') (*ptr)++;
if (*it == '-') (*ptr)--;
if (*it == '.') std::cout << *ptr;
if (*it == ',') std::cin >> *ptr;
if (*it == '[') {
if (*ptr == 0) {
++it;
int balance = 0;
while (*it != ']' || balance != 0) {
if (*it == '[') ++balance;
if (*it == ']') --balance;
++it;
}
}
}
if (*it == ']') {
if (*ptr != 0) {
--it;
int balance = 0;
while (*it != '[' || balance != 0) {
if (*it == ']') ++balance;
if (*it == '[') --balance;
--it;
}
}
}
++it;
}
}
int main(int argc, char* argv[]) {
execute(program);
}
I2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxmc3RyZWFtPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+Cgpjb25zdCBzdGQ6OnN0cmluZyBwcm9ncmFtID0gUiIoCisrKysrICsrKysrICAgICAgICAgICAgIGluaXRpYWxpemUgY291bnRlciAoY2VsbCAjMCkgdG8gMTAKWyAgICAgICAgICAgICAgICAgICAgICAgdXNlIGxvb3AgdG8gc2V0IHRoZSBuZXh0IGZvdXIgY2VsbHMgdG8gNzAvMTAwLzMwLzEwCiAgICA+ICsrKysrICsrICAgICAgICAgICAgICBhZGQgIDcgdG8gY2VsbCAjMQogICAgPiArKysrKyArKysrKyAgICAgICAgICAgYWRkIDEwIHRvIGNlbGwgIzIgCiAgICA+ICsrKyAgICAgICAgICAgICAgICAgICBhZGQgIDMgdG8gY2VsbCAjMwogICAgPiArICAgICAgICAgICAgICAgICAgICAgYWRkICAxIHRvIGNlbGwgIzQKICAgIDw8PDwgLSAgICAgICAgICAgICAgICAgIGRlY3JlbWVudCBjb3VudGVyIChjZWxsICMwKQpdCj4gKysgLiAgICAgICAgICAgICAgICAgIHByaW50ICdIJwo+ICsgLiAgICAgICAgICAgICAgICAgICBwcmludCAnZScKKysrKysgKysgLiAgICAgICAgICAgICAgcHJpbnQgJ2wnCi4gICAgICAgICAgICAgICAgICAgICAgIHByaW50ICdsJworKysgLiAgICAgICAgICAgICAgICAgICBwcmludCAnbycKPiArKyAuICAgICAgICAgICAgICAgICAgcHJpbnQgJyAnCjw8ICsrKysrICsrKysrICsrKysrIC4gIHByaW50ICdXJwo+IC4gICAgICAgICAgICAgICAgICAgICBwcmludCAnbycKKysrIC4gICAgICAgICAgICAgICAgICAgcHJpbnQgJ3InCi0tLS0tIC0gLiAgICAgICAgICAgICAgIHByaW50ICdsJwotLS0tLSAtLS0gLiAgICAgICAgICAgICBwcmludCAnZCcKPiArIC4gICAgICAgICAgICAgICAgICAgcHJpbnQgJyEnCj4gLiAgICAgICAgICAgICAgICAgICAgIHByaW50ICdcbicKKSI7Cgp1aW50OF90IG1lbW9yeVszMDAwMF07Cgp2b2lkIGV4ZWN1dGUoY29uc3Qgc3RkOjpzdHJpbmcmIHByb2dyYW0pIHsKICBhdXRvIGl0ID0gcHJvZ3JhbS5iZWdpbigpLCBlb2YgPSBwcm9ncmFtLmVuZCgpOwogIHVpbnQ4X3QqIHB0ciA9IG1lbW9yeTsKICB3aGlsZSAoaXQgIT0gZW9mKSB7CiAgICBpZiAoKml0ID09ICc+JykgcHRyKys7CiAgICBpZiAoKml0ID09ICc8JykgcHRyLS07CiAgICBpZiAoKml0ID09ICcrJykgKCpwdHIpKys7CiAgICBpZiAoKml0ID09ICctJykgKCpwdHIpLS07CiAgICBpZiAoKml0ID09ICcuJykgc3RkOjpjb3V0IDw8ICpwdHI7CiAgICBpZiAoKml0ID09ICcsJykgc3RkOjpjaW4gPj4gKnB0cjsKICAgIGlmICgqaXQgPT0gJ1snKSB7CiAgICAgIGlmICgqcHRyID09IDApIHsKICAgICAgICArK2l0OwogICAgICAgIGludCBiYWxhbmNlID0gMDsKICAgICAgICB3aGlsZSAoKml0ICE9ICddJyB8fCBiYWxhbmNlICE9IDApIHsKICAgICAgICAgIGlmICgqaXQgPT0gJ1snKSArK2JhbGFuY2U7CiAgICAgICAgICBpZiAoKml0ID09ICddJykgLS1iYWxhbmNlOwogICAgICAgICAgKytpdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICgqaXQgPT0gJ10nKSB7CiAgICAgIGlmICgqcHRyICE9IDApIHsKICAgICAgICAtLWl0OwogICAgICAgIGludCBiYWxhbmNlID0gMDsKICAgICAgICB3aGlsZSAoKml0ICE9ICdbJyB8fCBiYWxhbmNlICE9IDApIHsKICAgICAgICAgIGlmICgqaXQgPT0gJ10nKSArK2JhbGFuY2U7CiAgICAgICAgICBpZiAoKml0ID09ICdbJykgLS1iYWxhbmNlOwogICAgICAgICAgLS1pdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgICsraXQ7CiAgfQp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgZXhlY3V0ZShwcm9ncmFtKTsKfQ==