Skip to content

Instantly share code, notes, and snippets.

@theortsac
Created November 6, 2023 14:52
Show Gist options
  • Save theortsac/d11a51f088941609787841b9fd957d38 to your computer and use it in GitHub Desktop.
Save theortsac/d11a51f088941609787841b9fd957d38 to your computer and use it in GitHub Desktop.
#include <bits/stdc++.h>
using namespace std;
unsigned char tape[300000] = {0};
unsigned char* ptr = tape;
void interpret(const char* input)
{
char current_char;
unsigned int i, loop;
for (i = 0; input[i] != 0; ++i)
{
current_char = input[i];
switch (current_char)
{
case '>':
++ptr;
break;
case '<':
--ptr;
break;
case '+':
++*ptr;
break;
case '-':
--*ptr;
break;
case '.':
putchar(*ptr);
break;
case ',':
*ptr = getchar();
break;
case '[':
if (*ptr == 0)
{
loop = 1;
while (loop > 0)
{
current_char = input[++i];
if (current_char == '[')
loop++;
else if (current_char == ']')
loop--;
}
}
break;
case ']':
if (*ptr)
{
loop = 1;
while (loop > 0)
{
current_char = input[--i];
if (current_char == '[')
loop--;
else if (current_char == ']')
loop++;
}
}
}
}
}
char dict[8] = {'-', '>', '.', ']', '<', '+', '[', ','};
int mod(string num, int a)
{
int res = 0;
for (int i = 0; i < num.length(); i++)
res = (res * 10 + num[i] - '0') % a;
return res;
}
string longDivision(string number, int divisor)
{
string ans;
int idx = 0;
int temp = number[idx] - '0';
while (temp < divisor)
temp = temp * 10 + (number[++idx] - '0');
while (number.size() > idx) {
ans += (temp / divisor) + '0';
temp = (temp % divisor) * 10 + number[++idx] - '0';
}
if (ans.length() == 0)
return "0";
return ans;
}
void decode(string code) {
string brainfuck = "";
int p = 2;
while (code != "1") {
int op = 0;
while (!mod(code, p)) {
op++;
code = longDivision(code, p);
}
p++;
if (!op) continue;
brainfuck += dict[op - 1];
}
interpret(brainfuck.c_str());
}
int main() {
string code;
cin >> code;
decode(code);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment