🔖

Misskey上でBrainf*ckを実行できるPlayを作りました

2024/01/10に公開

Resoniteの方々がMisskeyにいるので、ちょっと前からユーザとしてMisskeyを使い始めました。また、そもそもFediverseについて何も知らないことに気づいたので、自分でもサーバを立ててみたり、ActivityPubまわりについて調べたりしていました。

MisskeyにはAiScriptという言語処理系が組み込まれていて、プラグインやツールをユーザが自作できるということを知り、興奮しています。そうなるとやっぱり、とりあえずBrainf*ckを実装してみたくなりますよね。そんなわけで、Misskey上でBrainf*ckのコードを実行できるPlayを書いてみました。

使い方

以下の動画の通りです。お好きにコードを書いて実行してください。

https://x.com/kentaro/status/1745058567005307266

,(文字の入力をうけつける命令)は実装していません(入力用のテキストボックスを用意すればできなくはなさそうですが)。

実装

コードは以下の通りです。Brainf*ckの部分は「Brainf*ckするLINE BotをGASで作る」を大幅に参考にしました。バージョン0.16.0で導入された関数を使っているので、Misskeyのバージョンが古いと動作しないと思います。その場合は、アップデートしてください。

/// @ 0.17.0

@brainfxck(code) {
  var ptr = 0
  var mem = [0, null]
  var pc = 0
  var tmp = 0

  var loop_count= 0
  var loop_limit = 1000000

  var output = []

  loop {
    if pc >= code.len break

    match (code.pick(pc)) {
      '>' => eval {
        ptr = ptr + 1
        if mem[ptr] == null {
          mem[ptr] = 0
          mem.push(null)
        }
      }
      '<' => ptr = ptr - 1
      '+' => mem[ptr] = mem[ptr] + 1
      '-' => mem[ptr] = mem[ptr] - 1
      '.' => output.push(Str:from_codepoint(mem[ptr]))
      '[' =>
        if mem[ptr] == 0 {
          tmp = 1
          loop {
            if tmp <= 0 break
            pc = pc + 1
            if code.pick(pc) == '[' tmp = tmp + 1
            if code.pick(pc) == ']' tmp = tmp - 1
          }
        }
      ']' =>
        if mem[ptr] != 0 {
          tmp = 1
          loop {
            if tmp <= 0 break
            pc = pc - 1
            if code.pick(pc) == ']' tmp = tmp + 1
            if code.pick(pc) == '[' tmp = tmp - 1
          }
          pc = pc - 1
        }
    }

    loop_count = loop_count + 1
    if loop_count >= loop_limit {
      output.push("... Too many loops!")
      break
    }

    pc = pc + 1
  }

  output.join("")
}

var code = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."

Ui:render([
  Ui:C:textarea({
    onInput: @(value) { code = value }
    default: code
    label: "Code"
  })
  Ui:C:button({
    text: "Run!"
    onClick: @() {
      var result = brainfxck(code)
      Ui:get("container").update({hidden: false})
      Ui:get("result").update({text: result})
    }
    primary: true
    rounded: true
  })
  Ui:C:container({
    children: [
      Ui:C:text({
        text: ""
      } "result")
    ]
    align: 'left'
    bgColor: '#000'
    fgColor: '#fff'
    font: 'monospace'
    borderWidth: 1
    borderColor: '#f00'
    padding: 5
    rounded: true
    hidden: true
  } "container")
])

それにしても、MisskeyのAiScriptは、いい感じのUIコンポーネントも実装されているし、やろうと思えばかなりいろんなことができそうで、面白いですね。

おわりに

Fediverseを支えるプロトコルや各種実装、エコシステムも素晴らしいですし、Misskeyのアプリケーションとしての完成度、機能の豊富さもすごいと思います。これからももっと遊び倒していきたいと思います。

GitHubで編集を提案

Discussion