2007-02-17 [長年日記]
λ. anarchy golf
激しく今更だが、anarchy golf に少し手を出してみる。 与えられたお題のプログラムを如何に短く書くかを競うだけなのだが、これがなかなか楽しい。5行でテトリスを書いたりしている人の気持ちが少し分かった気がする。
しかし、みんなコード短すぎ。ちょっと頭がおかしいんじゃないかと思う(褒め言葉)。例えば、eを100桁表示する問題 だと、今のところ私は以下のような素朴なプログラムしか思いついてなくて、これで66バイトなのだが、Haskellでのトップが42バイトで、全体のトップはRubyの32バイト。 むー、手も足もでないかも。
import Ratio main=print$round$sum$[10^100%x|x<-1:scanl1(*)[1..99]]
【追記】
1:scanl1(*)[1..99]
よりも scanl(*)1[1..99]
と書くべきだった。
その方が美しいし、2文字短い。
ずるいですが(36は後出しのつじつまあわせ)<br>main=print$36+sum(scanl(div)(10^100)[1..99])<br>44バイト<br>Rubyはeを必要な桁数求める関数 BigFloat::E(n)があるらしい<br>けどBigFloatは標準ライブラリ?
ああ、なるほど。これは酷い(笑<br>整数で計算したときの誤差はもっと大きいと思い込んでたけど、考えてみればこの程度だよなぁ……
整数で計算しても<br>main=print$foldr1(\x y->10^100+div y x)[1..90]<br>だと誤差でないです。まあ、これだと多分46Bより縮まないんでゴルフ的には負けですが
大変なことに気づきました。e表示問題の sample output は実は101桁です!(笑)
反応が遅くなりました。<br><br>>maoさん<br>なるほどー。<br>そんな手もありましたか。<br><br>>[1..100]>>=penさん<br>ΩΩ Ω な、なんだってー!?<br>10^100の時点で101桁になってることに気付くべきでした……