import Control.Applicative
import Control.Arrow
muntil p f x = f x >>= muntil p f
back = first . (++)
split (p:ps) = back [p] $ case p of
']' -> ([], ps)
'[' -> uncurry back
$ second split
$ split ps
_ -> split ps
eval' [] st = return ([], st)
eval' (p:ps) st = back [p] <$> case (p, st) of
('>', (xs, y:ys)) -> eval' ps (y:xs, ys)
('<', (x:xs, ys)) -> eval' ps (xs, x:ys)
('+', (xs, y:ys)) -> eval' ps (xs, (y + 1):ys)
('-', (xs, y:ys)) -> eval' ps (xs, (y - 1):ys)
('.', (xs
, y:ys
)) -> putChar (chr y
) >> eval
' ps (xs, y:ys) (',', (xs, _:ys)) -> getChar >>= \y -> eval' ps (xs, ord y:ys)
('[', st) -> do
(ps
', st') <- muntil
(\
(_, (_, y:
_)) -> y
== 0) (uncurry eval
') (ps, st) let (pxs, pys) = split ps'
back pxs <$> eval' pys st'
eval ps = eval' ps ([], repeat 0)
main = eval ">>+++++++[>++++++[>+<-]<-]+++++[>++[>>+<<-]<-]<<+++++[[>+>[-]>[-]<<[->+>+<<]>>[-<<+>>]<<>[>>.<<-]>>>.<<<<<-]]"
aW1wb3J0IERhdGEuQ2hhcgppbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZQppbXBvcnQgQ29udHJvbC5BcnJvdwoKbXVudGlsIHAgXyB4IHwgcCB4ID0gcmV0dXJuIHgKbXVudGlsIHAgZiB4ID0gZiB4ID4+PSBtdW50aWwgcCBmCgpiYWNrID0gZmlyc3QgLiAoKyspCgpzcGxpdCAocDpwcykgPSBiYWNrIFtwXSAkIGNhc2UgcCBvZgoJJ10nIC0+IChbXSwgcHMpCgknWycgLT4gdW5jdXJyeSBiYWNrICQgc2Vjb25kIHNwbGl0ICQgc3BsaXQgcHMKCV8gICAtPiBzcGxpdCBwcwoJCmV2YWwnICAgIFtdICBzdCA9IHJldHVybiAoW10sIHN0KQpldmFsJyAocDpwcykgc3QgPSBiYWNrIFtwXSA8JD4gY2FzZSAocCwgc3QpIG9mCgkoJz4nLCAoeHMsIHk6eXMpKSAtPiBldmFsJyBwcyAoeTp4cywgeXMpIAoJKCc8JywgKHg6eHMsIHlzKSkgLT4gZXZhbCcgcHMgKHhzLCB4OnlzKSAKCSgnKycsICh4cywgeTp5cykpIC0+IGV2YWwnIHBzICh4cywgKHkgKyAxKTp5cykKCSgnLScsICh4cywgeTp5cykpIC0+IGV2YWwnIHBzICh4cywgKHkgLSAxKTp5cykKCSgnLicsICh4cywgeTp5cykpIC0+IHB1dENoYXIgKGNociB5KSA+PiBldmFsJyBwcyAoeHMsIHk6eXMpCgkoJywnLCAoeHMsIF86eXMpKSAtPiBnZXRDaGFyID4+PSBceSAtPiBldmFsJyBwcyAoeHMsIG9yZCB5OnlzKQoJKCddJywgc3QpICAgICAgICAgLT4gcmV0dXJuIChwcywgc3QpCgkoJ1snLCBzdCkgICAgICAgICAtPiBkbwoJCShwcycsIHN0JykgPC0gbXVudGlsIChcKF8sIChfLCB5Ol8pKSAtPiB5ID09IDApICh1bmN1cnJ5IGV2YWwnKSAocHMsIHN0KQoJCWxldCAocHhzLCBweXMpID0gc3BsaXQgcHMnCgkJYmFjayBweHMgPCQ+IGV2YWwnIHB5cyBzdCcKCQkKZXZhbCBwcyA9IGV2YWwnIHBzIChbXSwgcmVwZWF0IDApCgptYWluID0gZXZhbCAiPj4rKysrKysrWz4rKysrKytbPis8LV08LV0rKysrK1s+KytbPj4rPDwtXTwtXTw8KysrKytbWz4rPlstXT5bLV08PFstPis+Kzw8XT4+Wy08PCs+Pl08PD5bPj4uPDwtXT4+Pi48PDw8PC1dXSI=