Home

Awesome

multi-reader by kuromunori

Aliceリスペクトの1記号が1つのコマンドになっている2次元言語です。

言語の仕様は以下に

大きな特徴

ソースコード

ソースコードは読み込まれたのち、それを包括する最小のN×Mの長方形として内部に格納されます。
これが命令ポインタが移動できる領域となります。
領域外へ命令ポインタが移動しようとするとRunTimeErrorとなり処理を停止します。

命令ポインタ

基本事項

以下の文字が命令ポインタとして扱われます。

Cmd説明
09命令ポインタ(入力機能なし)
az命令ポインタ (入力機能あり)

命令ポインタ間の基本の強さは
0<1<……<9<a<b<……<z
です。
各ポインタ間の基本強さは1ずつ異なります。

つまり、ポインタ0の基本強さは0、ポインタaの基本強さは10、ポインタzの基本強さは35です。
これらの文字が複数ソースコードに存在することは許されません。(コンパイルエラーとなります)
命令ポインタはソースコード内の初期位置からまず右へと移動していきます。
移動順は基本の強さの弱い方から1マスずつ進みます。
各ターンにおいて、まず移動を行い、命令ポインタの衝突があった場合は衝突処理をし、そのあとに移動後のマスのコマンドを実行します。(後述するコマンド#のみそのマスから移動する時に反映されます)
また、各命令ポインタは1つだけ値を格納することが出来ます。

命令ポインタの衝突

命令ポインタが移動した後のマスに他の命令ポインタがいた場合、コマンドを実行する前に衝突処理が発生します。
衝突処理ではぶつかった命令ポインタのうち、強さが弱い方のポインタが初期位置へと飛ばされます。
また、以下のコマンドでポインタの強さを増減できます。

Cmd説明
Uポインタの強さを1増やす。(Up)
Dポインタの強さを1減らす。(Down)

この増減した強さは衝突判定の時のみ有効で命令ポインタの実行順は基本強さで不変です。
例えばポインタbがUを2回通過すると強さは(11+2)で13となります。
強化後の強さが同じポインタが衝突した場合、基本強さの弱い方のポインタが初期位置へ飛ばされます。
ex)Uを2回通過したポインタaとポインタcではaが初期位置へ飛ばされる。

初期位置へ飛ばされる際、命令ポインタの移動方向、強化値は保存されます。
ポインタ0~9については格納された値も保存されます。

命令ポインタに格納される値

各命令ポインタは1つだけ値を持つことが出来ます。
これがそのまま変数となります。
ポインタ0~9の持つ変数の初期値は0です。
ポインタa~zの持つ変数の初期値は標準入力の1文字の文字コードが順に格納されます。
ex)ポインタ0,3,a,c,fがおり、標準入力が"Hello"のとき、

ポインタ03acf
初期値007210196

となる また、残りの入力はポインタa~zが他のポインタと衝突し、初期位置へ飛ばされるたびに飛ばされたポインタに1文字ずつ格納されていきます。 (元々ポインタa~zに格納されていた値は上書きされ破棄されます。) 標準入力が全て格納された後は-1が格納されます。 これ以外に標準入力を受け取る方法はありません。 また、以下のコマンドによって自身の現在の強さを値として格納することが出来ます。

Cmd説明
Gポインタの現在の強さを値として格納する。(Get)

ex)ポインタaがコマンドDを1度通過したのちコマンドGを通過すると命令ポインタaの持つ変数には9(=10-1)が格納される。

移動コマンド

multi-readersには命令ポインタの移動方向を変えるコマンドが多数存在します。 また、縦横方向に移動している時と斜め方向に移動している時で意味の変わるコマンドが存在します。

ミラー

縦横と斜めを切り替えるコマンドです。

Cmd説明
\ 命令ポインタの移動方向を縦横と斜めの間で切り替えます
/ 命令ポインタの移動方向を縦横と斜めの間で切り替えます

それぞれの移動方向の切り替え方は下図を参照してください。 Movement through mirrors

Cmd説明
_y方向の移動向きを反転させます
|x方向の移動向きを反転させます

それぞれ、指示のない方向は移動向きを変えません (斜め移動をしている場合は斜め移動のままです)

矢印

Cmd縦横斜め
^垂直に上へ移動しますy方向の向きが上になります
V垂直に下へ移動しますy方向の向きが下になります
>水平に右へ移動しますx方向の向きが右になります
<水平に左へ移動しますx方向の向きが左になります

(斜め移動をしている場合は斜め移動のままです)

四則演算コマンド

四則演算コマンドは加減乗除に加え、あまりの計算が用意されています。 これらのコマンドは縦横にとおるか、斜めに通るかで意味が変わります。 これらのコマンドはそれぞれ内部変数を持っています。 内部変数の初期値は0です。

Cmd縦横斜め
+ポインタの格納する変数を内部変数に代入ポインタの格納する変数+=内部変数
-ポインタの格納する変数を内部変数に代入ポインタの格納する変数-=内部変数
*ポインタの格納する変数を内部変数に代入ポインタの格納する変数×=内部変数
:ポインタの格納する変数を内部変数に代入ポインタの格納する変数÷=内部変数
%ポインタの格納する変数を内部変数に代入ポインタの格納する変数%=内部変数

文字→数値変換コマンド

ポインタの格納する変数が'0'~'9'のいずれかの文字の文字コードであった場合、それを数値へ変換します。 それ以外の文字コードを表す値であった場合は何もしません。

Cmd説明
Nポインタの格納する文字'0'~'9'を対応する数字へ変換して格納

出力コマンド

標準出力をするためのコマンドを4つ用意しています。

Cmd説明
Oポインタの格納する変数を数値として出力
Cポインタの格納する変数を文字として出力
S半角スペースを出力
E改行を出力

停止コマンド

このコマンドが命令ポインタのどれか一つに呼ばれたとき、プログラムを終了します。 停止コマンドをふまない限りプログラムが動き続けるので注意してください

Cmd説明
@どれか一つの命令ポインタに呼び出されたとき、プログラムを終了する

条件分岐コマンド

このコマンドのマスから移動する際、ポインタの格納している値が0以上であれば進行方向のマスを1つ飛ばして移動する。
0未満であれば通常通り移動する。

Cmd説明
#ポインタの格納する値が0以上であればマスを1つ飛ばして移動。

DEBUGモードについて

ソースコードをコンパイルする際に、

kusogengo -d code.txt

とすることで、DEBUGモードでプログラムを実行することが出来ます。 このモードでは各命令ポインタが1ステップずつ移動した後の盤面の状態を逐次表示してくれます。 デバッグにお役立てください