2017/08/10 00:05

繰り返しになりますが。プロジェクトの本文や、活動報告についての感想、ご意見、ご質問を、ぜひコメントでお寄せいただければと思います。現在は支援募集期間中であり、本企画の実施期間ではないため、お寄せいただいた感想などについてはリターンとしてではなく、お返事や回答をさせていただきます。

また、私個人についてはこちらをご覧ください。

この記事は、medium.comからの転載です。

先にこれを書きました:
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/ # A
bloop1
}
:loop2
/I+ I*i+/ {
s/(I+) (I*)i/\1 \2\1/ # B
# 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/ # A

loop2の “# B” です:
s/(I+) (I*)i/\1 \2\1/ # B

Aの方は、 “I” だらけだとわけがわからなくなるので、2つめの数を “i” に置き換えています。虚数を意味してるとかではありません。 “I” と区別できればいいだけなので、なんでもかまいません。

Bの方は、その “i” を一個ずつ、1つめの数の “I” の並びで置き換えています。この過程を確認したい場合は、 “multi.sed” のloop2のとこのここ:
# p

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