{-# OPTIONS_GHC -fexcess-precision #-} -- -- The Computer Language Shootout -- http://shootout.alioth.debian.org/ -- -- Translated from the Clean by Don Stewart -- -- Should be compiled with: -- -O -fglasgow-exts -optc-march=pentium4 -- -optc-O2 -optc-mfpmath=sse -optc-msse2 -- import System import Numeric main = do n <- getArgs >>= readIO . head let m = n-1 a = 27 + fromIntegral n putStr $ line "Ack" [3,n] (ack 3 n) show ++ line "Fib" [a] (fib a :: Double) (\n -> showFFloat (Just 1) n []) ++ line "Tak" [3*m,2*m,m] (tak (3*m) (2*m) m :: Int) show ++ line "Fib" [3] (fib 3 :: Int) show ++ line "Tak" [3,2,1] (tak 3 2 1 :: Double) show where line pre a r f = pre ++ "(" ++ csv f a "" ++ "): " ++ f r ++ "\n" csv f [a] s = s ++ f a csv f (a:b) s = s ++ f a ++ "," ++ csv f b s ack :: Int -> Int -> Int ack 0 n = n+1 ack m 0 = ack (m-1) 1 ack m n = ack (m-1) (ack m (n-1)) fib :: (Num a, Ord a) => a -> a fib n = if n >= 2 then fib (n-1) + fib (n-2) else 1 tak :: (Num a, Ord a) => a -> a -> a -> a tak x y z = if y < x then tak (tak (x-1) y z) (tak (y-1) z x) (tak (z-1) x y) else z