module Day02 ( day02_1, day02_2, ) where import Data.List (isInfixOf) import Data.List.Split (splitOn) sumInvalid :: [Int] -> Int sumInvalid = foldl addInvalid 0 where addInvalid acc n | odd (length (show n)) = acc | let l2 = length (show n) `div` 2, take l2 (show n) == drop l2 (show n) = acc + n | otherwise = acc sumInvalid' :: [Int] -> Int sumInvalid' = foldl addInvalid 0 where addInvalid acc n | let s = drop 1 $ show n ++ show n, show n `isInfixOf` take (length s - 1) s = acc + n | otherwise = acc getRange :: String -> [Int] getRange r = [read (takeWhile (/= '-') r) .. read $ drop 1 (dropWhile (/= '-') r)] parseInput :: IO [Int] parseInput = do concatMap getRange . splitOn "," <$> readFile "input/day2.txt" day02_1 :: IO () day02_1 = do values <- parseInput let result = sumInvalid values putStrLn $ "Day 2, Puzzle 1 solution: " ++ show result day02_2 :: IO () day02_2 = do values <- parseInput let result = sumInvalid' values putStrLn $ "Day 2, Puzzle 1 solution: " ++ show result