···11+import qualified Data.Char as C
22+import System.Environment (getArgs)
33+44+main = do
55+ args <- getArgs
66+ n <- case args of
77+ ["-"] -> getContents
88+ [file] -> readFile file
99+ let f = map C.digitToInt $ init n
1010+ l = length f
1111+ print $ sum $ map fst $ filter (uncurry (==)) $ zip f (tail f ++ [head f])
1212+ print $ sum $ map fst $ filter (uncurry (==)) $ zip f (drop (l `div` 2) (cycle f))
+23
src/2017/02.lhs
···11+import Control.Arrow ((&&&))
22+import Data.List (maximum, minimum)
33+import Data.List.Split (splitOn)
44+import System.Environment (getArgs)
55+66+parse = map read . splitOn "\t"
77+88+checksum = uncurry (-) . (maximum &&& minimum)
99+1010+divisible ls = sum [x `div` y | x <- ls, y <- ls, x `rem` y == 0, x /= y]
1111+1212+p1 = sum . map checksum
1313+1414+p2 = sum . map divisible
1515+1616+main = do
1717+ args <- getArgs
1818+ n <- case args of
1919+ ["-"] -> getContents
2020+ [file] -> readFile file
2121+ let f = map parse $ lines n
2222+ print $ p1 f
2323+ print $ p2 f
+19
src/2017/03.lhs
···11+import Data.List (maximum, minimum)
22+import Data.List.Split (splitOn)
33+import System.Environment (getArgs)
44+55+ring = toInteger . ceiling . (/ 2) . subtract 1 . sqrt . fromInteger
66+77+p1 n = curr + mid
88+ where
99+ curr = ring n
1010+ prev = (2 * curr - 1) ^ 2
1111+ mid = minimum $ map (abs . subtract n . (+ prev) . (* curr)) [1, 3, 5, 7]
1212+1313+main = do
1414+ args <- getArgs
1515+ n <- case args of
1616+ ["-"] -> getContents
1717+ [file] -> readFile file
1818+ let f = read $ init n
1919+ print $ p1 f