-- $Id: hash.ghc,v 1.3 2001/06/18 18:17:03 doug Exp $ -- http://www.bagley.org/~doug/shootout/ -- from Bryn Keller -- build with ghc -O2 -package data hash.ghc import System (getArgs) import FiniteMap import Numeric (showInt) countKeys tbl 0 = 0 countKeys tbl n = case (lookupWithDefaultFM tbl False (show n)) of True -> 1 + countKeys tbl (n - 1) _ -> countKeys tbl (n - 1) buildTable tbl max num | num <= max = buildTable (addToFM tbl (showHex num "") True) max (num + 1) | otherwise = tbl showHex n r = let (n',d) = quotRem n 16 r' = toEnum (fromEnum '0' + fromIntegral d) : r in if n' == 0 then r' else showHex n' r' main = do args <- getArgs case args of [number] -> let num = read number tbl = buildTable emptyFM num 1 in do putStrLn $ show (countKeys tbl num) _ -> fail "You must enter a number."