本文へスキップ
totonoe.tech

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

中級

COWを整える。

= 牛の鳴き声12種類でできた Brainfuck の仲間を、Brainfuck への対応つきで動かす

COW が初めての方は、先に そもそも COW とは・Brainfuck との対応 をどうぞ。

サンプル(クリックでエディタに入れる)

プログラム(moo の12種類以外の文字は、コメントとして無視されます) 入力するだけ・送信ゼロ

出力

「実行」を押すと、ここに出力が出ます。

ステップ再生

命令の列を1つずつ進め、メモリを見る

メモリ(太枠がいまのポインタ位置)

レジスタ(MMM が使う入れ物)

出力(ステップ再生中の途中経過)

 

変換

Brainfuck を COW に変える

Brainfuck の8命令のうち6つは、そのまま COW の1命令に置き換えられます。変換したあとの COW と元の Brainfuck を両方動かして、出力が同じになるかも確かめます。

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

続けて整える

運営サイト

私たちが運営するサイト