Skip to content

Commit fcd59f2

Browse files
committed
feat(2025-05/haskell): solve Part Two
1 parent d4f9131 commit fcd59f2

File tree

3 files changed

+17
-10
lines changed

3 files changed

+17
-10
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2025.5.1.0
1+
2025.5.2.0

package.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,8 @@ executables:
620620
aoc-2025-day05:
621621
<<: *executable
622622
main: AdventOfCode.Year2025.Day05
623+
dependencies:
624+
- data-interval
623625
_benchmark: &benchmark
624626
ghc-options:
625627
- -threaded

src/AdventOfCode/Year2025/Day05.hs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,23 @@ import AdventOfCode.Input (parseInputAoC, parseString)
77
import AdventOfCode.Puzzle
88
import AdventOfCode.TH (defaultMainPuzzle)
99
import 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')
1114
import Relude
1215
import Text.Trifecta (Parser, char, decimal, newline, sepEndBy)
1316

14-
database :: Parser ([(Integer, Integer)], [Integer])
17+
database :: Parser ([Interval Integer], [Integer])
1518
database = 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])
2427
getExample = parseString database example
2528

2629
example :: String
@@ -37,16 +40,18 @@ example =
3740
\17\n\
3841
\32"
3942

40-
getInput :: IO ([(Integer, Integer)], [Integer])
43+
getInput :: IO ([Interval Integer], [Integer])
4144
getInput = parseInputAoC 2025 5 database
4245

43-
partOne :: SimplePuzzle ([(Integer, Integer)], [Integer]) Int
46+
partOne :: SimplePuzzle ([Interval Integer], [Integer]) Int
4447
partOne =
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

5156
main :: IO ()
5257
main = $(defaultMainPuzzle)

0 commit comments

Comments
 (0)