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'] ]