/ 2025 / 2 / p2.hs
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