地下鉄の求人広告

(追記)
リンク元によると問題読み違えてたみたい。転職に失敗しちゃったな。

*Main> exec 180 == (concatMap show [1..]) !! 180
True
*Main> exec 5100000000
'3'
five_one_billion = 5100000000

exec :: Integer -> Char
exec idx = let (x, y) = f idx
               (d, m) = y `divMod` x
           in show (10 ^ (x - 1) + d) !! fromInteger m

f :: Integer -> (Integer, Integer)
f idx = recur 1 (idx + 1)
  where recur n idx = let i = idx - g n
                      in if i <= 0 then (n, idx - 1) else recur (n + 1) i

g :: Integer -> Integer
g 1 = 9
g n = n * 9 * (10 ^ (n - 1))