{-# LANGUAGE TupleSections #-} {-# OPTIONS -Wno-incomplete-uni-patterns #-} module Main where import qualified Data.Array as A import Input main :: IO () main = do let parseLine s = let [a,_,b] = words s in (parsePt a, parsePt b) parsePt s = let (a,_:b) = break (== ',') s in (read a, read b) :: (Int, Int) inp <- map parseLine <$> getInput 5 let minmax = (,) <$> minimum <*> maximum (minx, maxx) = minmax (concatMap (\((a,_),(b,_)) -> [a,b]) inp) (miny, maxy) = minmax (concatMap (\((_,a),(_,b)) -> [a,b]) inp) let enumLine diag ((x1,y1),(x2,y2)) | (diag && abs (x1 - x2) == abs (y1 - y2)) || x1 == x2 || y1 == y2 = let dx = signum (x2 - x1) dy = signum (y2 - y1) in [(x1 + i * dx, y1 + i * dy) | i <- [0 .. max (abs (x2 - x1)) (abs (y2 - y1))]] | otherwise = [] bd diag = A.accumArray (+) (0::Int) ((minx, miny), (maxx, maxy)) [((x, y), 1) | line <- inp , (x, y) <- enumLine diag line] print (length (filter (> 1) (A.elems (bd False)))) print (length (filter (> 1) (A.elems (bd True))))