難解プログラミング言語を整える
中級COWを整える。
= 牛の鳴き声12種類でできた Brainfuck の仲間を、Brainfuck への対応つきで動かす
COW が初めての方は、先に そもそも COW とは・Brainfuck との対応 をどうぞ。
サンプル(クリックでエディタに入れる)
出力
「実行」を押すと、ここに出力が出ます。
ステップ再生
命令の列を1つずつ進め、メモリを見る
メモリ(太枠がいまのポインタ位置)
レジスタ(MMM が使う入れ物)
出力(ステップ再生中の途中経過)
変換
Brainfuck を COW に変える
Brainfuck の8命令のうち6つは、そのまま COW の1命令に置き換えられます。変換したあとの COW と元の Brainfuck を両方動かして、出力が同じになるかも確かめます。
変換した COW
元の Brainfuck の出力
変換した COW の出力
そもそも COW とは
Brainfuck に4命令を足し、牛の鳴き声で書けるようにした言語。
COW(カウ)は、2003年に Sean Heber が作った言語です。esolangs.org では「牛(Bovinae)のために、おどけて作られた Brainfuck の変種」と紹介されています。
命令は12個で、Brainfuck より4個多い構成です。ほとんどの命令は moo の大文字小文字の違い(mOo・moO・MoO など)で、例外は MMM・OOO・OOM・oom の4つです。それ以外の文字はすべてコメントとして読み飛ばされるので、牛の鳴き声の間に好きな文章を挟めます。チューリング完全でもあります。
Brainfuck との対応
下の表の「Brainfuck」の列が、同じ働きをする Brainfuck の命令です。Brainfuck にない命令(mOO・OOO・MMM・OOM・oom)は「なし」と書いてあります。
| 命令 | 番号 | Brainfuck | 意味 |
|---|---|---|---|
| moo | 0 | ] | 対応する MOO まで戻って、そこからやり直す(直前の1命令は数えない) |
| mOo | 1 | < | メモリの位置を1つ前へ |
| moO | 2 | > | メモリの位置を1つ先へ |
| mOO | 3 | (なし) | 今の値を命令番号として実行する(3は無限ループになるので無効) |
| Moo | 4 | . , | 値が0なら1文字入力して格納、0以外なら値を文字として出力 |
| MOo | 5 | - | 今の値を1減らす |
| MoO | 6 | + | 今の値を1増やす |
| MOO | 7 | [ | 値が0なら次の1命令を飛ばして、対応する moo の後ろへ |
| OOO | 8 | (なし) | 今の値を0にする |
| MMM | 9 | (なし) | レジスタが空なら今の値をコピー、あれば貼り付けて空に戻す |
| OOM | 10 | (なし) | 今の値を整数として出力 |
| oom | 11 | (なし) | 整数を1つ入力して今の値にする |
- 「番号」は mOO が使います。mOO は今の値を命令番号として、その命令を実行します(値が2なら moO、6なら MoO)。値が3のときは mOO 自身になって終わらなくなるので無効で、範囲外の値のときも実行せずにプログラムを終えます。
- Moo は1つで入力と出力を兼ねています。今の値が0なら1文字入力、0以外ならその番号の文字を出力します。そのため、COW では「値が0の文字」を Moo で出力できません。
- MOO は「値が0なら、すぐ後ろの1命令を飛ばして、対応する moo の後ろへ」進みます。moo は「対応する MOO まで戻って、そこからやり直す」命令です。どちらも、隣にある1命令を数に入れずに対応を探します(esolangs.org に OOO MOO moo moo は2つ目の moo と対応する、という例があります)。このため、MOO や moo が隣り合うところは変換に注意が要ります。
言語の一覧は エソラング図鑑の COW のページ、元になった言語は Brainfuck の遊び場で見られます。
資料: esolangs.org: COW(12命令の説明と Hello World・フィボナッチの例)。 このページは12命令すべてに対応しています。サンプルの「ループなし Hello World」は、esolangs.org の同名の例がふつうの空白(文字番号32)ではなく改行できない空白(NBSP・文字番号160)を出していたため、このページが組み立てた版に差し替えています。ほかの2つは esolangs.org の例そのままです。 実装の取り決め: メモリは先頭から右へ最大30000マス、値は整数、ポインタが先頭より前に出るとエラーです。入力が尽きたあとの Moo と oom は 0 を入れます。実行は100万命令まで、出力は20万文字までで止めます。送信ゼロ(入力したものはこの端末から出ません)。
このツールについて
Brainfuck の仲間で、命令がすべて「moo」の大文字小文字違いでできています。実行して、メモリの値とポインタの動きをステップごとに見られます。Brainfuck を COW に変えて、同じ動きになるかも確かめられます。
Brainfuck に4命令を足し、命令がすべて牛の鳴き声になった言語。実行とステップ再生に加えて、Brainfuck を COW に変換して出力が同じになるか確かめられます。
主な機能
- 12命令すべてに対応(mOO・MMM・OOM・oom も)
- メモリ・ポインタ・レジスタのステップ再生
- Brainfuck との対応表
- Brainfuck → COW の変換と、元との出力比較
- 送信ゼロ
よくある質問
Q. COW の命令はいくつありますか?
A. 12個です。Brainfuck の8命令に近い動きのもの(moo・mOo・moO・Moo・MOo・MoO・MOO)と、COW 独自の mOO・OOO・MMM・OOM・oom があります。esolangs.org では Brainfuck より4つ多いと説明されています。
Q. 命令以外の文字はどうなりますか?
A. コメントとして無視されます。そのため、牛の鳴き声の間に好きな文章を書けます。
Q. Brainfuck の . と , はどの命令になりますか?
A. どちらも Moo が近い命令です。Moo は今の値が0なら1文字入力、0以外なら出力と、入力と出力を1つで兼ねています。このページの変換では , を「OOO Moo」(0にしてから入力)にしています。
Q. 変換した COW が元の Brainfuck と違う動きをするのはなぜですか?
A. Moo は値が0のとき出力でなく入力になるため、0 を出力する Brainfuck は同じ動きになりません。また、COW の値は 0〜255 で一周しません。ページでは出力の一致を並べて確認できます。
Q. MOO と moo の対応はどう探しますか?
A. MOO は後ろへ、moo は前へ探しますが、どちらも隣り合う1命令は数に入れません。MOO や moo が隣り合う所は対応がずれやすいので、変換時に何もしない対(moO mOo)を挟んでいます。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。