Created
May 20, 2017 17:07
-
-
Save foonathan/df24289409c6e4dd22507ec0d3dfa2bb to your computer and use it in GitHub Desktop.
C++ brainfuck interpreter using only `a`, `u`, `t`, and `o` characters plus symbols
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*** | |
* __________ .__ _____ __ | |
* \______ \____________ |__| _____/ ____\_ __ ____ | | __ ___________ _______ ______ ___________ | |
* | | _/\_ __ \__ \ | |/ \ __\ | \_/ ___\| |/ / \____ \__ \\_ __ \/ ___// __ \_ __ \ | |
* | | \ | | \// __ \| | | \ | | | /\ \___| < | |_> > __ \| | \/\___ \\ ___/| | \/ | |
* |______ / |__| (____ /__|___| /__| |____/ \___ >__|_ \ | __(____ /__| /____ >\___ >__| | |
* \/ \/ \/ \/ \/ |__| \/ \/ \/ | |
*/ | |
auto _ = +!!+[]{}; | |
auto _o_ = _-_; | |
auto _a__ = [](auto t, auto&& ... o) { t(o...); t(o...); }; | |
auto _a___ = [](auto t, auto&& ... o) { _a__(t, o...); _a__(t, o...); }; | |
auto _a____ = [](auto t, auto&& ... o) { _a___(t, o...); _a___(t, o...); }; | |
auto _a_____ = [](auto t, auto&& ... o) { _a____(t, o...); _a____(t, o...); }; | |
auto _a______ = [](auto t, auto&& ... o) { _a_____(t, o...); _a_____(t, o...); }; | |
auto _a_______ = [](auto t, auto&& ... o) { _a______(t, o...); _a______(t, o...); }; | |
auto _a________ = [](auto t, auto&& ... o) { _a_______(t, o...); _a_______(t, o...); }; | |
auto _a_________ = [](auto t, auto&& ... o) { _a________(t, o...); _a________(t, o...); }; | |
auto _a__________ = [](auto t, auto&& ... o) { _a_________(t, o...); _a_________(t, o...); }; | |
auto _a___________ = [](auto t, auto&& ... o) { _a__________(t, o...); _a__________(t, o...); }; | |
auto _a____________ = [](auto t, auto&& ... o) { _a___________(t, o...); _a___________(t, o...); }; | |
auto _a_____________ = [](auto t, auto&& ... o) { _a____________(t, o...); _a____________(t, o...); }; | |
auto _a______________ = [](auto t, auto&& ... o) { _a_____________(t, o...); _a_____________(t, o...); }; | |
auto _a_______________ = [](auto t, auto&& ... o) { _a______________(t, o...); _a______________(t, o...); }; | |
auto _a________________ = [](auto t, auto&& ... o) { _a_______________(t, o...); _a_______________(t, o...); }; | |
auto _a_________________ = [](auto t, auto&& ... o) { _a________________(t, o...); _a________________(t, o...); }; | |
auto _a__________________ = [](auto t, auto&& ... o) { _a_________________(t, o...); _a_________________(t, o...); }; | |
auto _a___________________ = [](auto t, auto&& ... o) { _a__________________(t, o...); _a__________________(t, o...); }; | |
auto _a____________________ = [](auto t, auto&& ... o) { _a___________________(t, o...); _a___________________(t, o...); }; | |
auto _a_____________________ = [](auto t, auto&& ... o) { _a____________________(t, o...); _a____________________(t, o...); }; | |
auto _a_ = [](auto t, auto&& ... o) { _a_____________________(t, o...); }; | |
auto _u_a = [](auto& a) { | |
auto a_ = _; | |
++a; | |
_a_([](auto& a, auto& a_) | |
{ | |
a_ > (+!!+[]{} - +!!+[]{}) ? ((*a == '[' && ++a_), (*a == ']' && --a_), ++a, _o_) : _o_; | |
}, a, a_); | |
--a; | |
}; | |
auto _u_ = [](auto& a, auto& a_, auto& u, auto& t) { | |
(t && u[t - _] == a) ? --t : _o_; | |
*a_ ? (u[t++] = a, _o_) : (_u_a(a), _o_); | |
}; | |
auto _t_ = [](auto* a, auto* a_, auto u, auto o, auto _o) { | |
auto t = _o_; | |
_a_([&]{ | |
auto aa = *a ? a + !!+[]{} : a; | |
*a == '>' && ++a_; | |
*a == '<' && --a_; | |
*a == '+' && ++*a_; | |
*a == '-' && --*a_; | |
*a == '.' && (o(*a_), _o_); | |
*a == ',' && (*a_ = _o()); | |
*a == ']' && (aa = u[t - _]); | |
*a == '[' && (_u_(a, a_, u, t), aa = a + _); | |
a = aa; | |
}); | |
}; | |
//==========// | |
// DEMO // | |
//=========// | |
#include <cstdio> | |
int main() | |
{ | |
const char* stack[100] = {}; | |
char array[1024] = {}; | |
auto code = R"(++++[++++>---<]>.-[--->++<]>-..----[->++<]>.-[--->+<]>.++++++++.-[-->+<]>-.[-->+<]>+++.[->+++<]>+.--[--->+<]>.-.-----.[--->+<]>-----.+[->++<]>+.-[--->++<]>-..-----------.+[->+++<]>.+++++.-------.+++++++++++..-------.+++++++++.-------.--.>++++++++++.)"; | |
_t_(code, &array[0], &stack[0], &std::putchar, &std::getchar); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment