Problem C. Recycled Numbers
出題範囲の数を全部列挙して、それぞれrecycled numberを作り出して出題範囲に収まっているかどうか調べてからrecycled numberだけを畳み込んで数える
import Data.List toInteger' s = read s :: Integer rotate lower upper n = let f1 n = n `div` 10 f2 n = (n `mod` 10) * 10 ^ (digitcount - 1) f3 n = f1 n + f2 n digitcount = length $ show n rec _ 0 r = length (filter (\x -> x >= lower && x <= upper) $ Data.List.nub r) - 1 rec n d r = rec (f3 n) (d - 1) ((f3 n) : r) in rec n (digitcount - 1) (n:[]) scan lower upper = (foldl' (\acc x -> acc + (rotate lower upper x)) 0 [lower..upper]) `div` 2 compute s = let f = map (toInteger') (words s) in scan (head f) (last f) main = do line <- getLine contents <- getContents putStrLn $ unlines $ map (\(i, line) -> "Case #" ++ show i ++ ": " ++ show (compute line)) $ zip [1..] $ lines contents