「esolang 」に今来た私が試したこと（ChatGPT先生と共に）

# はじめに
この記事は、[esolang Advent Calendar 2024](https://qiita.com/advent-calendar/2024/esolang) の1日目の記事となります。

アドベントカレンダのリストを見ていて、今、esolangに来た者の記録です。

# 基本事項
esolang ってなに？　というわけでChatGPT先生に聞いてみる。
![スクリーンショット 2024-12-15 18.38.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/ab250bbb-1d30-f73a-71e3-89efc07ed2ce.png)

![スクリーンショット 2024-12-15 18.39.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/091eb8fa-58ed-72b2-a966-77d3bd080795.png)

ほんとにChatGPT先生はなんでも知ってるな。本当かな・・でっちあげじゃないか試そう。

# ChatGPTに処理系を作ってもらう
![スクリーンショット 2024-12-15 18.41.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/6638dbd5-9d71-3f99-b846-a7c32617465f.png)
```html: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>
```
なんか出てきた。ブラウザで読み込んでみる。

![スクリーンショット 2024-12-15 18.46.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/719419b7-4297-ce3f-a843-d627e5e97dc0.png)

正しいのか分からない。Wikiを見てみる。

https://ja.wikipedia.org/wiki/Brainfuck

![スクリーンショット 2024-12-15 18.49.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/833a4a69-ec03-81ae-f8a9-fc30bc78b729.png)

HelloWorldがあった。これを入れてみよう。
```text:hello.txt
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
```

# 実行結果
![スクリーンショット 2024-12-15 18.52.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/3c5e72da-fca9-7d4f-eb15-40b348b25a00.png)

おお！　素晴らしい！　
全部ちゃんと動くのかは分からないけど。これは正しいようだ。

私には見えないものがChatGPT先生には見えていた。

以上、簡単ですが、「esolang」に今来た私が試したこと（ChatGPT先生と共に）、でした。