難解プログラミング言語を整える
初級Deadfishを整える。
= 4命令だけの言語で、値の推移を表で追い、目的の数値から最短コードを作る
① Deadfish を実行
i / d / s / o の並びを入力します。それ以外の文字は無視します。
RESULT
「実行する」を押すと、oで出力された値がここに並びます
| # | 命令 | 値(リセット後) |
|---|
② 数値 → 最短コードを生成
出したい数値を入れると、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の「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。