円周率の近似値となる分数を算出するワンライナー

ちょっと思うところあって"355/113"のような円周率に非常に近い値を表せる分数はないかと思って、それらを求めるワンライナーを考えてみた。

perl -MMath::Trig -le '($a=$_*pi)=~/\.(0{4}|9{4})/ && print int$a+$a=~/\.9/," / $_" for 1..100000'

for文で探索する範囲、正規表現での0または9の繰り返しの数で精度を調節。$aの値を出力してみるとわかりやすいかも。
結果表示に/\.9/へのマッチを使って繰り上げたりと、ちょっとトリッキーなことをしてるけど、これでちゃんと求められるっぽい。

$ perl -MMath::Trig -le '($a=$_*pi)=~/\.(0{4}|9{4})/ && print int$a+$a=~/\.9/," / $_" for 1..100000'
355 / 113
710 / 226
1065 / 339
103283 / 32876
103638 / 32989
103993 / 33102
104348 / 33215
104703 / 33328
105058 / 33441
207276 / 65978
207631 / 66091
207986 / 66204
208341 / 66317
208696 / 66430
209051 / 66543
209406 / 66656
311624 / 99193
311979 / 99306
312334 / 99419
312689 / 99532
313044 / 99645
313399 / 99758
313754 / 99871


実際の値はどうなの?というときはパイプでつないでevalしてみよう。

$ perl -MMath::Trig -le '($a=$_*pi)=~/\.(0{4}|9{4})/ && print int$a+$a=~/\.9/," / $_" for 1..100000' | perl -lpe '$_ .= " = ". eval'
355 / 113 = 3.14159292035398
710 / 226 = 3.14159292035398
1065 / 339 = 3.14159292035398
103283 / 32876 = 3.14159265117411
103638 / 32989 = 3.14159265209615
103993 / 33102 = 3.1415926530119
104348 / 33215 = 3.14159265392142
104703 / 33328 = 3.14159265482477
105058 / 33441 = 3.14159265572202
207276 / 65978 = 3.14159265209615
207631 / 66091 = 3.14159265255481
207986 / 66204 = 3.1415926530119
208341 / 66317 = 3.14159265346744
208696 / 66430 = 3.14159265392142
209051 / 66543 = 3.14159265437386
209406 / 66656 = 3.14159265482477
311624 / 99193 = 3.14159265270735
311979 / 99306 = 3.1415926530119
312334 / 99419 = 3.14159265331576
312689 / 99532 = 3.14159265361894
313044 / 99645 = 3.14159265392142
313399 / 99758 = 3.14159265422322
313754 / 99871 = 3.14159265452434