本文へスキップ
totonoe.tech

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

初級

Deadfishを整える。

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

Deadfish が初めての方は、先に そもそも Deadfish とは・何の役に立つのか をどうぞ。

① Deadfish を実行

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

Deadfish ソース 入力するそばから計算(会社のPCでも、入力は外に出ません)

結果

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

値の推移(1命令ごと)
# 命令 値(リセット後・棒は0〜255の目盛り)

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

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

目的の数値 入力するそばから計算(会社のPCでも、入力は外に出ません)

そもそも Deadfish とは

命令が4つだけ。計算機というより、「数をいじるおもちゃ」のような言語。

Deadfish(デッドフィッシュ)は、2003年ごろ Jonathan Todd Skinner が作ったとされる言語です。命令は「1増やす(i)」「1減らす(d)」「2乗する(s)」「出力する(o)」の4つだけで、プログラムは数を1つだけ持ち続けます。

分岐も繰り返しもなく、ふつうの言語のようにいろいろな計算を書くことはできません。しかも値が -1 や 256 になると、勝手に 0 に戻るという変わった規則があります。「最小の言語を作ってみる」という遊びから生まれた、簡単だけれど癖の強い言語です。

何の役に立つのか

  • 言語を「作る側」の入門になる

    命令が4つなので、実行するプログラムを自分で書いても短く済みます。最初の一歩に向いています。

  • 「計算できる範囲」の限界を知る

    分岐も繰り返しも持たないので、ふつうの言語と同じ計算はできません。何が足りないと何ができないのかを考える材料になります。

  • 最短の命令列を探す問題に触れる

    目的の数を作る最短の並びを探す、という探索の考え方を、小さな例で体験できます。

  • 「数が戻る」規則を通じて、桁あふれを考える

    決まった範囲を超えると 0 に戻る規則は、コンピューターの数の扱い(桁あふれ)を考えるきっかけになります。

  • 研修のアイスブレイクになる

    4文字で動くプログラム、という話は、プログラミングに不慣れな人にも伝わりやすい題材です。

普通の言語と比べると

  • 変数は持てず、数はいつも1つだけです。
  • 分岐も繰り返しもなく、書いた順に実行するだけです。
  • 数が範囲を超えたときは、ふつうの言語ではバグ扱いですが、Deadfish では規則として 0 に戻ります。

上の実行環境でサンプルを動かしたあと、好きな数をコードに変える欄で、最短の並びがどうなるか試してみてください。

解説

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 の自動リセット規則の可視化
  • 送信ゼロ
  • 値の推移を棒で表示(256で0に戻る行も一目で分かる)

よくある質問

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の「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。

続けて整える

運営サイト

私たちが運営するサイト