本文へスキップ
totonoe.tech

難解プログラミング言語を整える

初級

Deadfishを整える

= 4命令だけの言語で、値の推移を表で追い、目的の数値から最短コードを作る

① Deadfish を実行

i / d / s / o の並びを入力します。それ以外の文字は無視します。

Deadfish ソース 入力するそばから計算(送信ゼロ)

RESULT

「実行する」を押すと、oで出力された値がここに並びます

値の推移(1命令ごと)
# 命令 値(リセット後)

② 数値 → 最短コードを生成

出したい数値を入れると、0から幅優先探索で最短のi/d/s列を求めます(oは自動で末尾に付きます)。

目的の数値 入力するそばから計算(送信ゼロ)

解説

4命令しかないのに、なぜ「256は作れない」のか。

Deadfishは2003年ごろ、Jonathan Todd Skinnerが発表した言語(esolangs.org: Deadfish)です。1つのアキュムレータ(値を1つだけ持つ箱)に対して、加算・減算・2乗・出力の4命令しか用意されていません。加えて「値が -1 または 256 になった直後は自動的に 0 に戻る」という規則があり、この2つの値は一瞬たりとも保持できません。たとえば「iisso」は 1→2→4→16 と進んで16を出力しますが、さらに「s」を1回足した「iissso」は 16の2乗=256 になった瞬間に0へリセットされ、出力は16ではなく0になります。

命令 意味
i 今の値に +1
d 今の値に -1
s 今の値を2乗
o 今の値を出力(数値のまま。文字には変換しない)

このリセット規則があるため、たとえば256という数値そのものは、どんな命令列を使ってもDeadfish上には一度も存在させられません(作った瞬間に0に戻ってしまうため)。②の生成機能に256を入れるとエラーになるのはこのためです。原典の仕様には「i/d/s/o以外の文字は改行を出力する」という規定もありますが、本ページではその挙動を実装せず、単に無視します。

あわせてエソラング図鑑Brainfuckの遊び場もどうぞ。

送信ゼロ(入力したコードはこの端末から出ません)。生成の探索範囲には安全のための上限があります(極端に大きい数値は探索対象外)。

このツールについて

Deadfishは4つの命令(i・d・s・o)しか持たない言語です。四則演算すらなく「+1」「-1」「2乗」「出力」だけですが、値が-1または256になった直後に自動で0へ戻るという特殊な規則があり、これが計算の幅を大きく制限しています。ソースコードを実行して値の推移を見る、逆に目的の数値を最短の命令列で作る、の両方を試せます。

4命令しかないのに 256 という値だけは作れない言語。実行して値の推移を見る、逆に目的の数字から最短の命令列を自動生成する、の両方ができます。

主な機能

  • 1命令ごとの値の推移表
  • 数値→最短 i/d/s 列の自動生成(幅優先探索)
  • −1/256 の自動リセット規則の可視化
  • 送信ゼロ

よくある質問

Q. なぜ256という値だけ特別なのですか?

A. Deadfish の規則で「値が −1 または 256 になった直後は自動的に 0 に戻る」と決まっているためです。この2つの値は一瞬も保持できません。

Q. iisso(5命令)はなぜ16になるのですか?

A. i=1、i=2、s=4、s=16 と進み、o でその16を出力します。2乗(s)を2回繰り返すと 1→2→4→16 と急に増えます。

Q. iissso(6命令)はなぜ0になるのですか?

A. 5命令目の s で16の2乗=256になり、直後に自動リセットで0に戻るためです。6命令目の o はリセット後の0を出力します。

Q. 数値100を最短で作るには何命令必要ですか?

A. このページの生成機能(幅優先探索)で自動計算できます。手計算では気づきにくい「2乗を使った近道」も見つかります。

Q. i/d/s/o 以外の文字を入れたらどうなりますか?

A. 無視されます。原典の仕様には「それ以外の文字は改行を出力する」という規定もありますが、このページではその挙動は実装していません。

入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。

続けて整える

KOINOBORI ECOSYSTEM

私たちが運営するサイト