Skip to content

Commit 9289b1b

Browse files
committed
Keep range mappings separate from ranges
1 parent 4558f5c commit 9289b1b

File tree

1 file changed

+9
-10
lines changed

1 file changed

+9
-10
lines changed

05.hs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ main = interact $ (++ "\n") . show . ((,) <$> p1 <*> p2) . parseAlmanac
66

77
data Almanac = Almanac { seeds :: [Int], maps :: [Map] }
88
type Map = [RangeMapping]
9-
data RangeMapping = RangeMapping { from :: Range, to :: Range }
9+
data RangeMapping = RangeMapping { from :: Int, to :: Int, rlen :: Int }
1010
data Range = Range { start :: Int, len :: Int }
1111

1212
parseAlmanac :: String -> Almanac
@@ -20,11 +20,10 @@ parseAlmanac s = case parse almanac "" s of
2020
seeds = string "seeds: " *> nums <* count 2 newline
2121
mapHeader = many1 (letter <|> char '-' <|> sp) >> char ':'
2222
endOfLineOrFile = void endOfLine <|> eof
23-
rangeMapping = mkRangeMapping <$> (num <* sp) <*> (num <* sp) <*> num
23+
rangeMapping = flip RangeMapping <$> (num <* sp) <*> (num <* sp) <*> num
2424
map = mapHeader *> newline *> (rangeMapping `endBy` endOfLineOrFile)
2525
maps = map `endBy` endOfLineOrFile
2626
almanac = Almanac <$> seeds <*> maps
27-
mkRangeMapping a b c = RangeMapping (Range b c) (Range a c)
2827

2928
p1, p2 :: Almanac -> Int
3029
p1 Almanac { seeds, maps } = solve (map (`Range` 1) seeds) maps
@@ -44,14 +43,14 @@ transformRanges rs m = concatMap (`transformRange` m) rs
4443
-- may cause the range to split.
4544
transformRange :: Range -> [RangeMapping] -> [Range]
4645
transformRange r [] = [r]
47-
transformRange r (rm:rms) = concatMap transform (intersections r (from rm))
46+
transformRange r (rm:rms) = concatMap transform (intersections r rm)
4847
where transform x = case mapRange rm x of
4948
Nothing -> transformRange x rms
5049
Just y -> [y]
5150

5251
-- Not necessarily symmetric.
53-
intersections :: Range -> Range -> [Range]
54-
intersections r@Range { start = s, len = n } r'@Range { start = s', len = n' }
52+
intersections :: Range -> RangeMapping -> [Range]
53+
intersections r@Range { start = s, len = n } RangeMapping { from = s', rlen = n' }
5554
| s > e' = [r]
5655
| e < s' = [r]
5756
| s < s' = mk s (s' - 1) : if e <= e' then [mk s' e] else [mk s' e', mk (e' + 1) e]
@@ -64,9 +63,9 @@ intersections r@Range { start = s, len = n } r'@Range { start = s', len = n' }
6463
-- boundaries of the 'from' range mapping (i.e. either it falls completely
6564
-- within, or is completely outside).
6665
mapRange :: RangeMapping -> Range -> Maybe Range
67-
mapRange RangeMapping { from, to } r@Range { start = s, len = n }
68-
| inRange from s = Just $ Range (s - start from + start to) n
66+
mapRange rm@RangeMapping { from, to, rlen } r@Range { start, len }
67+
| within rm start = Just $ Range (start - from + to) len
6968
| otherwise = Nothing
7069

71-
inRange :: Range -> Int -> Bool
72-
inRange r i = i >= start r && i <= (start r + len r)
70+
within :: RangeMapping -> Int -> Bool
71+
within RangeMapping { from, rlen } i = i >= from && i <= from + rlen

0 commit comments

Comments
 (0)