Skip to content

Commit 05853c2

Browse files
committed
Reduce
1 parent 9289b1b commit 05853c2

File tree

1 file changed

+8
-18
lines changed

1 file changed

+8
-18
lines changed

05.hs

Lines changed: 8 additions & 18 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 :: Int, to :: Int, rlen :: Int }
9+
data RangeMapping = RangeMapping { from :: Int, to :: Int, rmLen :: Int }
1010
data Range = Range { start :: Int, len :: Int }
1111

1212
parseAlmanac :: String -> Almanac
@@ -44,28 +44,18 @@ transformRanges rs m = concatMap (`transformRange` m) rs
4444
transformRange :: Range -> [RangeMapping] -> [Range]
4545
transformRange r [] = [r]
4646
transformRange r (rm:rms) = concatMap transform (intersections r rm)
47-
where transform x = case mapRange rm x of
48-
Nothing -> transformRange x rms
49-
Just y -> [y]
47+
where transform x | within rm (start x) = [apply rm x]
48+
| otherwise = transformRange x rms
49+
within RangeMapping { from, rmLen = n } i = i >= from && i <= from + n
50+
apply RangeMapping { from, to } r = Range (start r - from + to) (len r)
5051

5152
-- Not necessarily symmetric.
5253
intersections :: Range -> RangeMapping -> [Range]
53-
intersections r@Range { start = s, len = n } RangeMapping { from = s', rlen = n' }
54+
intersections r@Range { start = s, len } RangeMapping { from = s', rmLen }
5455
| s > e' = [r]
5556
| e < s' = [r]
5657
| s < s' = mk s (s' - 1) : if e <= e' then [mk s' e] else [mk s' e', mk (e' + 1) e]
5758
| s <= e' = if e <= e' then [mk s e] else [mk s e', mk (e' + 1) e]
58-
where e = s + n
59-
e' = s' + n'
59+
where e = s + len
60+
e' = s' + rmLen
6061
mk rs re = Range rs (re - rs)
61-
62-
-- This is guaranteed to be called with a range that does not cross over the
63-
-- boundaries of the 'from' range mapping (i.e. either it falls completely
64-
-- within, or is completely outside).
65-
mapRange :: RangeMapping -> Range -> Maybe Range
66-
mapRange rm@RangeMapping { from, to, rlen } r@Range { start, len }
67-
| within rm start = Just $ Range (start - from + to) len
68-
| otherwise = Nothing
69-
70-
within :: RangeMapping -> Int -> Bool
71-
within RangeMapping { from, rlen } i = i >= from && i <= from + rlen

0 commit comments

Comments
 (0)