chapter5 Math
5-1 Count
challenge: 7 lines
5 lines
code:5-1.a2b
(once)1=a
a<=<aa
<=
a0=a<
a1=a<a
5-2 A+1
challenge: 4 lines
4 lines
code:5-2.a2b
(once)=(end)+
0+=1
1+=+0
(start)+=1
5-3 A+B
challenge: 9 lines
19 lines (fast)
code:5-3_fast.a2b
(once)=(start)|
0_=(end)n
1_=(end)i
0n=(start)0
0i=(start)1
1n=(start)1
1i=(start)^0
0^=1
1^=^0
0<=(start)0
1<=(start)1
|<<=|<
|<=
(end)+=<<<<<<
e=(end)+
|+=|e
9 lines
code:5-3_short.a2b
# decrement right
0v=v1
1v=0
+0=+
# increment left
0^=1
1^=^0
^=1
# finish
(end)+=
# init state
@=(end)v
+=^+@
5-4 A-B
challenge: 8 lines
7 lines
code:5-4.a2b
# decrement
0v=v1
1v=0
-0=-
(start)0=
# finish
(end)-=
# init state
@=(end)v
-=v-@
5-5 A*B
challenge: 28 lines
18 lines
code:5-5.a2b
# decrement
0v=v1
1v=0
*0=*
+0=+
# increment
0^=1
1^=^0
^=1
# * => +
P=(start)+
@=(start)0
!=(start)1
0<=@<0
1<=!<1
<=(end)v
(end)*1=
*=<P*
# plus
=(end)v
(end)+=
+=^+>
5-6 A/B
challenge: 40 lines
方針: AからBを何回引けるかカウントする
1. Q[B]A という構造に変換する
Qは商カウンタで初期値0
2. Bを末尾に複製してQ[B]A-B とする
3. A-B部分を計算する
A>Bの時、末尾が-0になった所で(end)-0=(start)iとして商のカウントアップをする
A=Bの時、商のカウントアップした後[B]0部分を消去して,0を付け足す(fin)
A<Bで]の後ろが0になった時、0-(B-R)となっている(Rは余り)はずなので
]0-を-に置き換えてB-(B-R)を計算する。
またRの計算が終わった後に[を,に置き換えてQ,Rとなるよう仕掛けを仕込む
33 lines
code:5-6.a2b
## setup
(once)=(start)],
(once)=(end)mmmmm
0m=(start)0
1m=(start)1
/m=/
(end)/=(start)0[_~
# 割り切れた時に商のカウントアップよりB以下の消去を優先
0z=z
1z=z
[z=^,0
# 商のカウントアップ (先頭にiが置かれたらスタート)
i0=0i
i1=1i
0^=1
1^=^0
(start)^=1
i[=^[_~
## ~を走査してBを複製し、末尾にv-,>Bを生成する
~=(end)v-,>
@=(end)0
!=(end)1
_0=0@_
_1=1!_
_]=]
## 後ろにvが置かれている数をデクリメント
0v=v1
1v=0
,01=,1
=(end)v
## 割り切れた場合末尾が],0-,0になっているので余り0を出力する操作へ
## 割り切れない場合末尾が],0-,(B-R)になっているので
## ],0を取り除いてB-(B-R)を計算する形を作り、剰余Rを算出する
## また、剰余の計算後に商をインクリメントしないようフラグ(%)を仕込む
(end)],0-,0=z
(end)-,0=(start)i
],0-=%-
## 剰余計算の準備
0%=%0
1%=%1
[%=,
i,=,
## sub loop start
-=v->