Life Goes On

まあまあだけど楽しんでる方です

112問目

http://projecteuler.net/index.php?section=problems&id=112
すべての数字が昇順または降順に並んでいる数を考える。2 桁以下の数はすべてそうだが、桁が増えるとその割合は減っていく。そのような数の割合がちょうど 1% になるのはいくつのときか求める。
昇順・降順の数を順に生成して数えました。

main = print $ euler112 100

euler112 :: Integer -> Integer
euler112 n = fst $ last $ takeWhile cond $ zip (map (* n) [1..]) decsAndIncs
    where cond (i, s) = i > s

decsAndIncs :: [Integer]
decsAndIncs = map read $ concat $ concat $ zipWith (zipWith next) decs incs
    where next ds is = ds ++ tail is
          decs = f (>=)
          incs = f (<=)

f :: (Char -> Char -> Bool) -> [[[String]]]
f op = iterate (map next) [ [[d]] | d <- ['1'..'9'] ]
    where next dss = [ ds ++ [d] | ds <- dss, d <- filter (op (last ds)) ['0'..'9'] ]