四則演算esolang
四則演算を用いて種々の命令を記述する
一部の例外を除いて a = b の形式で記述される
等式として間違っている演算が存在した場合実行不可能(コンパイルエラー)
= の左辺と右辺の書き方によって命令が変化する
命令は基本的にはアドレスn(0-index)のメモリを操作するものだが一部異なる
- a + b = c …アドレスaとアドレスbの和をアドレスcに格納する(差積商も同様)
- a = b + c … アドレスaの値がアドレスbとアドレスcにコピーされる
- a = b - c … アドレスaがアドレスbより小さいならばアドレスc行戻る
- a = b * c … アドレスaを、アドレスbがアドレスcより小さければ文字として、そうでなければ数値として出力
- a = b / c … アドレスaに、アドレスbがアドレスcより小さければ文字として、そうでなければ数値として1文字入力を保存する
- a + b = c + d … アドレスaとアドレスbの値を比較して、等しければアドレスc行そうでなければアドレスd行飛ぶ(右辺と左辺で加減乗除がどのように組み合わさっていてもよい)
特殊記法
- a = a … アドレスaの値をaにする
- b / 0 … アドレスb行飛ぶ
補足
- 3つ以上の項が登場する演算は、2項になるまで計算される
- その際の演算順は、加減乗除および括弧の優先順位に依存する
処理系はrubyで記述した
以下のようにコマンドを記述することでファイルを実行する
echo <標準入力> | ruby eso.rb <ファイル名>
雑な実装をしたので標準入力が必要ないプログラムでも標準入力を与えないと動かないようになってしまった(ごめんなさい……)
1 = 1
1 + 1 = 2
2 + 1 = 3
2 + 2 = 4
4 + 4 = 8
8 - 1 = 7
8 + 2 = 10
8 + 4 = 12
8 + 8 = 16
16 + 16 = 32
32 + 1 = 33
32 + 12 = 44
32 + 32 = 64
64 + 64 = 128
128 - 16 = 112
112 - 8 = 104
104 - 3 = 101
104 + 4 = 108
108 + 3 = 111
111 + 8 = 119
111 + 3 = 114
104 - 4 = 100
104 = 13 * 8
101 = 1 * 101
108 = 54 * 2
108 = 27 * 4
111 = 37 * 3
44 = 11 * 4
32 = 2 * 16
119 = 17 * 7
111 = 37 * 3
114 = 57 * 2
108 = 36 * 3
100 = 25 * 4
33 = 11 * 3
10 = 5 * 2
1 = 1
1 + 1 = 2
2 + 2 = 4
4 + 1 = 5
5 + 2 = 7
5 * 2 = 10
10 = 5 + 5
5 + 14 = 19
3 + 46 = 49
49 = 7 * 7
3 + 1 = 4
4 + 8 = 12
12 - 9 = 3
3 + 9 = 12
12 = 19 - 7
2 = 2
10 = 10
10 = 5 + 5
6 = 6
6 - 5 = 1
20 = 40 / 2
20 + 0 = 2 + 18
20 = 2 * 10
1 / 0