p2.hs
1 import Text.Parsec 2 3 integer = read <$> many digit 4 5 range = do 6 start :: Int <- integer 7 char '-' 8 end <- integer 9 return [start .. end] 10 11 ranges = range `sepBy` (char ',') 12 13 takeEvery _ "" = [] 14 takeEvery n str = take n str : takeEvery n (drop n str) 15 16 isRepeat str = any isRepeat_ [1 .. (length str `div` 2)] 17 where 18 isRepeat_ n = all (== (take n str)) (takeEvery n str) 19 20 answer contents = sum $ read <$> filter isRepeat (show <$> concat input) 21 where 22 Right input = parse ranges "" contents 23 24 main = getContents >>= print . answer