diff --git a/03/Main.idr b/03/Main.idr index d0cbb27..2e06c0e 100644 --- a/03/Main.idr +++ b/03/Main.idr @@ -44,13 +44,32 @@ parseBackpack input = duplicatedItems : Backpack -> List Item duplicatedItems (B left right) = nub $ intersect left right +-- Shared items across a collection of backpack +shared : List Backpack -> List Item +shared xs = + let combined = map (\(B left right) => left ++ right ) xs + in nub . intersectAll $ combined + +-- Chunk a list +chunk : Nat -> List a -> List (List a) +chunk x [] = [] +chunk x xs = + let head = take x xs + tail = chunk x . drop x $ xs + in head :: tail + main : IO () main = do file <- readFile "input" case file of Right content => let backpacks = catMaybes . map parseBackpack . lines $ content - priorityTotals = foldl (+) 0 . map (foldl (+) 0 . map priority . duplicatedItems) $ backpacks + priorityTotals = sum . map (sum . map priority . duplicatedItems) $ backpacks + elves = chunk 3 backpacks + badges = map shared elves + badgeTotal = sum . map (sum . map priority) $ badges in do putStr "part 1: " printLn priorityTotals + putStr "part 2: " + printLn badgeTotal Left err => printLn err