カメヲラボ

主にプログラミングとお勉強全般について書いてます

1,000 Digits Of Pi(0)

http://codegolf.com/1000-digits-of-pi
タイトル通り、円周率πを小数点以下1000桁求める問題です。ついにshinhさんとkinabaさんがトップ10入り。さすがですナァ(´ω`) で、私はと言うと、ようやく2桁台に突入。kurimuraさんの一つ下までやってきました。Code Golfは参加者がそれほど多くないのと、参加者の大半が凄腕ハカーなのか知りませんが全然情報がありません;-;

とりあえず、Wikipediaで円周率の歴史を見ながら適当に公式を探し続けてこんな公式にたどり着きました。

π/4 = atan(1/2) + atan(1/3)

ハットンの公式というらしい。見た目がスッキリなのでコレを採用。シャープの公式というのもよさげだったのだけど、√3の扱いがうまく出来なくて断念。収束速度はまずまずで、2000回ほどのループで求めることができた。Rubyは標準で多倍長計算が出来るようで感動。しかし整数のみなので、1000桁ちょっと底上げしなければならないのが辛い。何が辛いってーと、出力の際にたった一つ'.'を表示するだけで結構なロスになるのだ。

そんなかんじでごにょごにょと弄っているうちに、83バイトになった。後でよく見ると82バイトだったが、1バイト縮んだ程度ではどーにもならないので放置。とりあえず出来たコードを晒しとこう・・・と思ったら自分のSubmitしたコードは見ることが出来ないのね(;´д`)
というわけで、思い出して書いてみる(間違ってるかもw)

0.upto(k=x=2000){|n|t=10**k*~0**n*4/n-=~n
x+=t/2**n+t/3**n}
puts"3."+x.to_s[1,1e3]

たしか、こんなかんじ。

しかしここから目一杯削ったとしても、70バイト未満になる見通しがまったく立たない。もっと良い計算方法があるのか、出力をもっと工夫できるのか、根本的にチガウのか・・・。ぐむぅ。