import qualified Data.Map as M import Data.List.Split main :: IO () main = do input <- map (map read . filter (/="->")) <$> map (splitOneOf ", ") <$> lines <$> readFile "input" let part1inp = filterOrth input print $ length $ M.filter (> 1) $ M.fromListWith (+) (toMap part1inp) print $ length $ M.filter (> 1) $ M.fromListWith (+) (toMap input) filterOrth :: [[Int]] -> [[Int]] filterOrth [] = [] filterOrth ([x1,y1,x2,y2]:ss) | x1==x2 || y1==y2 = [x1,y1,x2,y2]:filterOrth ss | otherwise = filterOrth ss toMap :: [[Int]] -> [((Int,Int),Int)] toMap [] = [] toMap ([x1,y1,x2,y2]:xs) | y1==y2 = zip ySame (repeat 1) ++ toMap xs | x1==x2 = zip xSame (repeat 1) ++ toMap xs | otherwise = zip diag (repeat 1) ++ toMap xs where diag = zip xRange yRange ySame = zip xRange (repeat y1) xSame = zip (repeat x1) yRange xRange = [x1,x1-(signum $ x1-x2)..x2] yRange = [y1,y1-(signum $ y1-y2)..y2]