I’m new to CodeChef and thought of trying a few problems, so I solved the “Bytelandian gold coins” problem. (http://www.codechef.com/problems/COINS/) I’m getting instant results on my computer, CodeChef sets a 9 second time limit, but i’m still getting TimeOuts from CodeChef. I don’t have any clue anymore what causes this. Any hints would be helpfull.
My code:
module Main where
import qualified Data.Map as M
import Data.Map (Map)
import Data.Maybe
main = do
catch (main' M.empty 1) (const $ return ())
main' _ 11 = return ()
main' m c = do
x <- readLn
let (k,m2) = sol m x
print k
main' m2 (c+1)
sol :: Map Integer Integer -> Integer -> (Integer, Map Integer Integer)
sol m x |M.member x m = (fromJust $ M.lookup x m,m)
|x > x2+x3+x4 = (x,M.insert x x m)
|otherwise = (fullSoll, M.insert x fullSoll m4)
where
x2 = div x 2
x3 = div x 3
x4 = div x 4
(sx2, m2) = sol m x2
(sx3, m3) = sol m2 x3
(sx4, m4) = sol m3 x4
fullSoll = sx2+sx3+sx4
Your
soldoesn’t terminate when thex == 0. Whenxis 1 it is fine because all ofx2, x3, x4are 0, and their sum is less thanx, meaning the second guard is true, and no recursion. However, when the input is 0, then the recursive case kicks in, and it never terminates.