Skip to content

Instantly share code, notes, and snippets.

@foonathan
Created May 20, 2017 17:07
Show Gist options
  • Save foonathan/df24289409c6e4dd22507ec0d3dfa2bb to your computer and use it in GitHub Desktop.
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
/***
* __________ .__ _____ __
* \______ \____________ |__| _____/ ____\_ __ ____ | | __ ___________ _______ ______ ___________
* | | _/\_ __ \__ \ | |/ \ __\ | \_/ ___\| |/ / \____ \__ \\_ __ \/ ___// __ \_ __ \
* | | \ | | \// __ \| | | \ | | | /\ \___| < | |_> > __ \| | \/\___ \\ ___/| | \/
* |______ / |__| (____ /__|___| /__| |____/ \___ >__|_ \ | __(____ /__| /____ >\___ >__|
* \/ \/ \/ \/ \/ |__| \/ \/ \/
*/
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