Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック問題86

問題86 分数の計算

問題のファイルは

https://github.com/shellgei/shellgei160

からダウンロードできる。

分数の組み文字を普通の数に直して計算する問題だった。大変面倒な問題だった。

解答例は

$ cat fractions | tr -d ' \n' | nkf -w16B0 | xxd -p -u | fold -b4 | grep -f- -w /usr/share/unicode/UnicodeData.txt | awk -F';' 'BEGIN{print "puts "}{gsub("/",",",$9);print "Rational("$9")"}' | paste -sd+ | ruby

となる。余計な空白や改行文字を除いてからまずUTF-16の方式で表現しなおすらしい。そこでnkf までの出力をみるとなんだかよくわからない文字列になっている。!^!Z!Qというものが出てきたがどう見ても文字コードと関係なさそうで本当にきちんと処理できているのか不安になる。正味のところ何が出力されているのかよくわからない。しかしここで立ち止まってもしょうがないので、ひとまず置いといて次に進むことにする。UTF-16を出力した後は16進数に直している。UTF-16は4バイトで1文字なのでfold で4バイトごとに改行を入れる。これで組み文字を普通の数に直す下準備が終わったので、まず16進数になった分数を検索語としてgrepunicodeの関連データから分数の組み文字情報を探す。次にawkRubyのコードを書いていく。gsubで$9のフィールドの「/」を「,」に置換して分数計算の式を書く。あとはpaste で空白を+に置換してRubyに入力すれば計算ができる。