Another approach to day 1
[advent-of-code-17.git] / adventofcode1701 / app / advent01verbose.hs
1 {-# LANGUAGE NegativeLiterals #-}
2
3 module Main(main) where
4
5 import Data.List (tails)
6
7 main :: IO ()
8 main = do
9 digits <- readFile "data/advent01.txt"
10 print $ part1 digits
11 print $ part2 digits
12
13 part1 :: String -> Integer
14 part1 = sum_valid_pairs . part1_extract
15
16 part2 :: String -> Integer
17 part2 = sum_valid_pairs . part2_extract
18
19 part1_extract :: String -> [String]
20 part1_extract digits = map (take 2) $ tails (digits ++ [head digits])
21
22 part2_extract :: String -> [String]
23 part2_extract digits = map (\ds -> (take 1 ds) ++ (take 1 $ drop offset ds))
24 $ take (length digits)
25 $ tails (digits ++ digits)
26 where offset = length digits `div` 2
27
28 sum_valid_pairs :: [String] -> Integer
29 sum_valid_pairs possibles = sum $ map (read . take 1)
30 $ filter (\(x:y:_) -> x == y)
31 $ filter (\p -> length p == 2) possibles
32