Skip to content

Instantly share code, notes, and snippets.

@kagamoc
Last active September 6, 2021 06:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kagamoc/ecaa39226e8b927f88540cd6c0af658e to your computer and use it in GitHub Desktop.
Save kagamoc/ecaa39226e8b927f88540cd6c0af658e to your computer and use it in GitHub Desktop.
Brainf*ck Interpreter for LINE Messaging API (using Google Apps Script)
var ACCESS_TOKEN = '';
var url = 'https://api.line.me/v2/bot/message/reply';
function doPost(e) {
replyMessage(e);
return ContentService.createTextOutput(
JSON.stringify({ content: 'post ok' })
).setMimeType(ContentService.MimeType.JSON);
};
var replyMessage = function (e) {
var userMessage = JSON.parse(e.postData.contents)
.events[0].message.text;
var replyToken = JSON.parse(e.postData.contents)
.events[0].replyToken;
UrlFetchApp.fetch(url, {
headers: {
'Content-Type': 'application/json; charset=UTF-8',
Authorization: 'Bearer ' + ACCESS_TOKEN
},
method: 'post',
payload: JSON.stringify({
replyToken: replyToken,
messages: [
{
type: 'text',
text: brain(userMessage)
}
]
})
});
};
function brain(text) {
var code = text
.replace(/!|\!/g, '>')
.replace(/?|\?/g, '<')
.replace(/〜/g, '+')
.replace(/ー/g, '-')
.replace(/。/g, '.')
.replace(/、/g, ',')
.replace(/(/g, '[')
.replace(/)/g, ']')
.replace(/[^><\+-\.,\[\]]/g, "");
var input = (text + '""')
.replace(/「|」/g, "\"")
.match(/".*?"/g)[0]
.replace(/"/g, "");
return brainfuck(code, input);
}
function brainfuck(code, input) {
var ptr = 0; // pointer
var mmr = [0, null]; // memory
var pc = 0; // program counter
var ic = 0; // input counter
var tmp = 0; // to avoid double brackets
var steps = 0;
var step_limit = 1000000;
var output = "";
for (pc = 0; pc < code.length; pc++) {
switch (code[pc]) {
case '>':
ptr++;
if (!mmr[ptr]) { // add a space in mmr
mmr[ptr] = 0;
mmr.push(null);
}
break;
case '<': ptr--; break;
case '+': mmr[ptr]++; break;
case '-': mmr[ptr]--; break;
case '.':
output += String.fromCharCode(mmr[ptr]);
break;
case ',':
mmr[ptr] = input.charCodeAt(ic);
ic++;
break;
case '[':
if (!mmr[ptr]) {
tmp = 1;
while (tmp) {
pc++;
if (code[pc] == '[') tmp++;
if (code[pc] == ']') tmp--;
}
}
break;
case ']':
if (mmr[ptr]) {
tmp = 1;
while (tmp) {
pc--;
if (code[pc] == ']') tmp++;
if (code[pc] == '[') tmp--;
}
pc--;
}
break;
}
steps++;
if (steps >= step_limit) {
output = "ERR: There are too many steps.";
break;
}
}
return output ? output : "ERR: There is no result.";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment