はじめに
この記事は、esolang Advent Calendar 2024 の1日目の記事となります。
アドベントカレンダのリストを見ていて、今、esolangに来た者の記録です。
基本事項
esolang ってなに? というわけでChatGPT先生に聞いてみる。
ほんとにChatGPT先生はなんでも知ってるな。本当かな・・でっちあげじゃないか試そう。
ChatGPTに処理系を作ってもらう
esolang.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Brainfuck Runner</title>
</head>
<body>
<h1>Brainfuck Runner</h1>
<textarea id="code" rows="5" cols="50">++++++++[>+++++++++<-]>++.+.</textarea><br><br>
<button id="runButton">Run</button>
<pre id="output"></pre>
<script>
// Simple Brainfuck interpreter
function runBrainfuck(code) {
const tape = new Uint8Array(30000);
let ptr = 0;
let out = "";
let pc = 0;
// Precompute loop jumps
let stack = [];
let jumpMap = {};
for (let i = 0; i < code.length; i++) {
if (code[i] === '[') {
stack.push(i);
} else if (code[i] === ']') {
let start = stack.pop();
jumpMap[start] = i;
jumpMap[i] = start;
}
}
while (pc < code.length) {
let cmd = code[pc];
switch (cmd) {
case '>': ptr++; break;
case '<': ptr--; break;
case '+': tape[ptr]++; break;
case '-': tape[ptr]--; break;
case '.': out += String.fromCharCode(tape[ptr]); break;
case ',': /* no input */ break;
case '[':
if (tape[ptr] === 0) {
pc = jumpMap[pc];
}
break;
case ']':
if (tape[ptr] !== 0) {
pc = jumpMap[pc];
}
break;
}
pc++;
}
return out;
}
document.getElementById('runButton').addEventListener('click', function() {
const code = document.getElementById('code').value;
const output = runBrainfuck(code);
document.getElementById('output').textContent = output;
});
</script>
</body>
</html>
なんか出てきた。ブラウザで読み込んでみる。
正しいのか分からない。Wikiを見てみる。
HelloWorldがあった。これを入れてみよう。
hello.txt
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
実行結果
おお! 素晴らしい!
全部ちゃんと動くのかは分からないけど。これは正しいようだ。
私には見えないものがChatGPT先生には見えていた。
以上、簡単ですが、「esolang」に今来た私が試したこと(ChatGPT先生と共に)、でした。