@@ -7,20 +7,23 @@ import AdventOfCode.Input (parseInputAoC, parseString)
77import AdventOfCode.Puzzle
88import AdventOfCode.TH (defaultMainPuzzle )
99import AdventOfCode.Util (count )
10- import Data.Ix (inRange )
10+ import Data.Interval (Extended (.. ), Interval , (<=..<=) )
11+ import Data.Interval qualified as Interval
12+ import Data.IntervalSet qualified as ISet
13+ import Data.List.Extra (sumOn' )
1114import Relude
1215import Text.Trifecta (Parser , char , decimal , newline , sepEndBy )
1316
14- database :: Parser ([( Integer , Integer ) ], [Integer ])
17+ database :: Parser ([Interval Integer ], [Integer ])
1518database = do
1619 idRange <- some $ do
1720 from <- decimal <* char ' -'
1821 to <- decimal <* newline
19- pure (from, to)
22+ pure (Finite from <=..<= Finite to)
2023 ingredients <- newline *> decimal `sepEndBy` newline
2124 pure (idRange, ingredients)
2225
23- getExample :: IO ([( Integer , Integer ) ], [Integer ])
26+ getExample :: IO ([Interval Integer ], [Integer ])
2427getExample = parseString database example
2528
2629example :: String
@@ -37,16 +40,18 @@ example =
3740 \17\n \
3841 \32"
3942
40- getInput :: IO ([( Integer , Integer ) ], [Integer ])
43+ getInput :: IO ([Interval Integer ], [Integer ])
4144getInput = parseInputAoC 2025 5 database
4245
43- partOne :: SimplePuzzle ([( Integer , Integer ) ], [Integer ]) Int
46+ partOne :: SimplePuzzle ([Interval Integer ], [Integer ]) Int
4447partOne =
4548 asks \ (ranges, ingredients) ->
46- count (flip any ranges . flip inRange ) ingredients
49+ count (flip any ranges . Interval. member ) ingredients
4750
48- partTwo :: SimplePuzzle ([(Integer , Integer )], [Integer ]) ()
49- partTwo = fail " not yet implemented"
51+ partTwo :: SimplePuzzle ([Interval Integer ], [Integer ]) Integer
52+ partTwo =
53+ sumOn' ((1 + ) . Interval. width)
54+ <$> withPuzzle fst (asks (ISet. toList . ISet. fromList))
5055
5156main :: IO ()
5257main = $ (defaultMainPuzzle)
0 commit comments