This commit is contained in:
Gattix 2021-12-12 01:55:00 +01:00
parent 5ab4cd7856
commit 8a8721bb26

View File

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