Version 2. I realized last night that my initial approach was way more complicated than it needed to be...
import Data.List
import Data.Semigroup
maxJolt :: Int -> [Char] -> Int
maxJolt r xs = read $ go r (length xs) xs
where
go r n xs =
(\(Arg x xs) -> x : xs) . maximum $
do
(n', x : xs') <- zip (reverse [r .. n]) (tails xs)
return . Arg x $ if r == 1 then [] else go (r - 1) (n' - 1) xs'
main = do
input <- lines <$> readFile "input03"
mapM_ (print . sum . (`map` input) . maxJolt) [2, 12]