day 5
This commit is contained in:
parent
60a5c07b09
commit
5a2807d94c
1 changed files with 56 additions and 0 deletions
56
05/solution.hs
Normal file
56
05/solution.hs
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
import Debug.Trace
|
||||
import Data.Maybe
|
||||
import Data.List
|
||||
|
||||
(***) :: (a -> a') -> (b -> b') -> (a, b) -> (a', b')
|
||||
(f *** g) (x, y) = (f x, g y)
|
||||
|
||||
(&&&) :: (a -> b) -> (a -> c) -> a -> (b, c)
|
||||
(f &&& g) x = (f x, g x)
|
||||
|
||||
infixr 3 ***
|
||||
infixr 3 &&&
|
||||
|
||||
traceOut :: Show a => a -> a
|
||||
traceOut x = traceShow x x
|
||||
|
||||
addFirst :: [[a]] -> a -> [[a]]
|
||||
addFirst [] x = [[x]]
|
||||
addFirst (y:ys) x = (x : y) : ys
|
||||
|
||||
split :: Eq a => [a] -> [a] -> [[a]]
|
||||
split _ [] = []
|
||||
split delims (x:xs)
|
||||
| x `elem` delims = [] : split delims xs
|
||||
| otherwise = addFirst (split delims xs) x
|
||||
|
||||
parseFile :: String -> ([(Int, Int)], [Int])
|
||||
parseFile = (map (read *** read . drop 1) . map (break (=='-')) *** map read . drop 1) . break (=="") . split ['\n']
|
||||
|
||||
elemRange :: (Int, Int) -> Int -> Bool
|
||||
elemRange (x, y) z = x <= z && z <= y
|
||||
|
||||
solve1 :: ([(Int, Int)], [Int]) -> Int
|
||||
solve1 (xs, ys) = length $ filter id $ map (\y -> foldl (||) False $ map (`elemRange` y) xs) ys
|
||||
|
||||
joinRanges :: [(Int, Int)] -> Maybe (Int, Int)
|
||||
joinRanges [] = Nothing
|
||||
joinRanges xs = Just $ (foldl1 min . map fst &&& foldl1 max . map snd) xs
|
||||
|
||||
rangesIntersect :: (Int, Int) -> (Int, Int) -> Bool
|
||||
rangesIntersect (p, q) (r, s) = (p <= r && r <= q) || (p <= s && s <= q) || (r <= p && p <= s)
|
||||
|
||||
mergeRanges :: [(Int, Int)] -> (Int, Int) -> [(Int, Int)]
|
||||
mergeRanges xs y = (fromJust $ joinRanges $ y : merge) : noMerge
|
||||
where (merge, noMerge) = partition (rangesIntersect y) xs
|
||||
|
||||
solve2 :: ([(Int, Int)], [Int]) -> Int
|
||||
solve2 = sum . map (\(a, b) -> b-a+1) . foldl mergeRanges [] . fst
|
||||
|
||||
main = do
|
||||
fileinp <- readFile "input.txt"
|
||||
let input = parseFile fileinp
|
||||
let solved1 = solve1 input
|
||||
let solved2 = solve2 input
|
||||
print solved1
|
||||
print solved2
|
||||
Loading…
Add table
Add a link
Reference in a new issue