sedで掛け算(超簡略版)
先にこれを書きました:
足し算ができるなら、掛け算くらいなら手軽にできるだろうと思いますね? はいできます。
先と同じく1~9の1桁の任意の数の掛け算です。先の記事ではいくつの数の足し算でもかまいませんでしたが、今回は2つの数の掛け算に限定します。
コードはこちら。名前は “multi.sed” とします:
p
s/1/I/g
s/2/II/g
s/3/III/g
s/4/IIII/g
s/5/IIIII/g
s/6/IIIIII/g
s/7/IIIIIII/g
s/8/IIIIIIII/g
s/9/IIIIIIIII/g
s/ *\* */ /g
s/ *$//
p
:loop1
/I+ i*I+/ {
s/(I+) (i*)I/\1 \2i/
bloop1
}
:loop2
/I+ I*i+/ {
s/(I+) (I*)i/\1 \2\1/
# p
bloop2
}
s/^I+ +//
データはこれとします。名前は “multi.dat” とします:
2 * 3
3 * 3
“multi.sed” に “multi.dat” を食わせると、こうなります:
$ sed -r -f multi.sed multi.dat
2 * 3
II III
IIIIII # ここが結果
3 * 3
III III
IIIIIIIII # ここが結果
ここで、「# ここが結果」は表示されません。ですが、計算はできています。
コードの肝はloop1のここ(仮にAとします)と:
s/(I+) (i*)I/\1 \2i/
loop2のここ(仮にBとします)です:
s/(I+) (I*)i/\1 \2\1/
Aの方は、 “I” だらけだとわけがわからなくなるので、2つめの数を “i” に置き換えています。虚数を意味してるとかではありません。 “I” と区別できればいいだけなので、なんでもかまいません。
Bの方は、その “i” を一個ずつ、1つめの数の “I” の並びで置き換えています。この過程を確認したい場合は、 “multi.sed” のloop2のとこのここ:
# p
この “#” を消してみてください。
追記 (重要) Apr 16, 2019:
このstoryはあくまでパズルです。
この辺りからチューリング・マシンに話を繋げていきたいとは考えていますが、構想の段階です。