module Days.Day03 (day03, splitInto, commonItem) where import AOC (Solution (..)) import qualified Data.Text as T import Data.List import Data.Maybe import Debug.Trace day03 :: Solution day03 = Solution parseInput part1 part2 parseInput :: T.Text -> [[String]] parseInput input = go [] allLines where go acc [] = reverse acc go acc xs = go (take 3 xs : acc) (drop 3 xs) allLines = map T.unpack $ T.lines input priority :: Char -> Int priority = (+1) . fromJust . flip elemIndex (['a'..'z'] ++ ['A'..'Z']) splitInto :: Int -> [a] -> [[a]] splitInto s xs = go [] xs where go acc [] = reverse acc go acc xs' = go (take takeInt xs' : acc) (drop takeInt xs') takeInt = round $ (fromIntegral $ length xs) / (fromIntegral s) commonItem :: Eq a => [[a]] -> [a] commonItem [] = [] commonItem xs = foldl1' intersect xs part1 :: [[String]] -> Int part1 input = sum $ map (priority . head . commonItem . splitInto 2) (concat input) part2 :: [[String]] -> Int part2 input = sum $ map (priority . head . commonItem) input -- part2 input = sum $ map (sum . map (priority . head . commonItem . splitInto 2)) (traceShowId input) -- part2 input = traceShowId input