Hi all,
I recently decided to rewrite the pidigits
benchmark of the debian shootout (shootout.alioth.debian.org) as toy
project.
However, it seems that on my machine, the code seems to be more
performant than both the current entry and the proposed replacement (see
http://www.haskell.org/haskellwiki/Shootout/Pidigits) for the same number of lines.
Do you think it might be worth
submitting my entry? Here is my code,:
import System
data F = F Integer Integer Integer
Integer
extract s@(F k n a d) = ((n*3+a) `div` d,
(n*4+a) `div` d, s)
update (F k n a d) = F (k+1) (n*k) ((a+n*2)*y)
(d*y) where y = 2*k+1
next state = let (u, v, s'@(F k n a d)) =
extract (update state) in
if (n > a || (u /= v)) then next s' else
(show u, F k (n*10) ((a-d*u)*10) d)
digits = ("", (F 1 1 0
1)):[next state | state <- map snd digits]
pr (d:t) k n | k > n = putStr
""
|
k `mod` 10 /= 0 = putStr d >> pr t (k+1)
n
|
otherwise = putStrLn (d ++ "\t:" ++ show k) >> pr t (k+1) n
main = pr (map fst (tail digits)) 1 . read . head
=<< getArgs
Best,
Arnaud