🙃
dc(1) で円周率を求める
3 月 14 日 = 円周率の日に間に合わなかったやつです. Unix-Like な環境ならどこでも入ってるであろう dc を使ったネタです.
暇な人は次のように実行してください.しばらくしたあとに円周率 (に近い値) が表示されます.
$ echo '6k10K^1-[d2-d1<A]dsAx0dsasF[[lar-sa0sF]sZ]sC[[la+sa1sF]sZlF1=C1r/lZxz0<m]dsmx4la*p' | dc
処理時間が長すぎて待ちきれない人は echo に渡されている文字列の先頭の 6 を 5 にしてください.
説明
中学生の頃に BASIC で時間を溶かしたみなさんなら見覚えのある式ですね.収束が結構遅めのやつです.
6k # 精度は 6 桁
10K^1-[d2-d1<A]dsAx # すべての奇数を列挙する
0dsasF # 各種レジスタを初期化
[[lar-sa0sF]sZ]sC # 奇数番目の処理に上書きするマクロ
[
[la+sa1sF]sZ # 偶数番目だと仮定
lF1=C # 奇数番目なら上書き
1r/ # 逆数に変換
lZx # 足し込み処理
z0<m # スタック高さ 1 までループ
]dsmx # ここまで arctan(1)
4la*p # 円周率の表示
Discussion