28 lines
951 B
Haskell
28 lines
951 B
Haskell
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]
|