{-|
Module:         Day1
Description:    <http://adventofcode.com/2017/day/1 Day 1: Inverse Captcha>
-}
{-# OPTIONS_HADDOCK ignore-exports #-}
module Day1 (day1a, day1b) where

import Control.Monad (ap, liftM2)
import Data.Char (digitToInt, isDigit)

-- |The 'digits' function returns a list of digits contained in a string.
digits :: String -> [Int]
digits = map digitToInt . filter isDigit

day1a :: String -> Int
day1a = sum . map fst . filter (uncurry (==)) . ap zip (tail . cycle) . digits

day1b :: String -> Int
day1b = sum . map fst . filter (uncurry (==)) .
        ap zip (liftM2 drop half cycle) . digits
  where half = (`div` 2) . length