-- import Debug.Trace import qualified Data.Map as M -- import qualified Data.Set as S import Data.List main :: IO () main = do numStrs <- readFile "data/advent10.txt" let nums = map (read @Int) $ lines numStrs let device = 3 + maximum nums let sortedNums = sort (0:device:nums) print $ part1 sortedNums print $ part2 sortedNums part1 :: [Int] -> Int part1 nums = jolt1s * jolt3s where jolt1s = joltNs 1 nums jolt3s = joltNs 3 nums joltNs d ns = length $ filter diff $ zip ns (tail ns) where diff (a, b) = (b - a) == d part2 :: [Int] -> Int part2 nums = snd $ M.findMax $ foldl includeAdapter (M.singleton 0 1) $ tail nums includeAdapter arrangements adapter = M.insert adapter earlierCount arrangements where earlierArrangements = M.filterWithKey (\k _ -> (adapter - k) <= 3) arrangements earlierCount = M.foldl (+) 0 earlierArrangements