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

この “#” を消してみてください。


One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.